Re: Relative paths in require_once problem (possibly all include
Re: Relative paths in require_once problem (possibly all include
am 03.01.2008 14:58:10 von Logos
On Jan 2, 9:20 pm, Jerry Stuckle wrote:
> Logos wrote:
> > On Jan 2, 3:48 pm, Jerry Stuckle wrote:
> >> Logos wrote:
> >>> On Dec 17 2007, 5:27 am, Jerry Stuckle
> >>> wrote:
> >>>> Royan wrote:
> >>>>> Thanks Steve, thats a great idea, i've especially liked that part :)
> >>>>>>> $relativePath = strlen($parsedUri) - strlen($relativeUri) - 1;
> >>>>> Unfortunately this approach works great only if you can modify PHP.ini
> >>>>> but when you are on virtual hosting, the only way you can modify
> >>>>> settings in PHP.ini is by calling ini_set() function which has to be
> >>>>> invoced from somewhere. And in my case this "somewhere" is global.inc
> >>>>> This file is meant to keep all global stuff so it has to be included
> >>>>> into each and every file in my project, but this is the original
> >>>>> problem -- i can'tincludeit. Seems to be a vicious circle.
> >>>>> The only solution i can think of right now is to use the absolute path
> >>>>> for "global.inc" in each call to require_once. Thus i can put your
> >>>>> code that calculates relative path in "global.inc" and use it across
> >>>>> all other files.
> >>>>> 2BKDotCom
> >>>>>>> logger.inc doesn't need toincludeglobal.inc as long as global.inc
> >>>>>>> has been included before logger.inc is included..
> >>>>> It appears I've made a mistake in my original post. In fact you don't
> >>>>> have toinclude"global.inc" into foo.php, the error would persist. If
> >>>>> you wish I can send you test files that replicate the problem
> >>>>> On Dec 17, 2:30 am, "Steve" wrote:
> >>>>>> "Royan" wrote in message
> >>>>>>news:8769e733-17fe-4083-865c-ccd496707023@e25g2000prg. googlegroups.com...
> >>>>>>> Ok the problem is quite hard to explain, but i'll try to keep it as
> >>>>>>> simple as i can. Imagine I have the following structure of my files
> >>>>>>> and folders:
> >>>>>>> /root/global.inc
> >>>>>>> |__/files/foo.php
> >>>>>>> |__/utils
> >>>>>>> |__/logs/logger.inc
> >>>>>>> When I run foo.php I get the following error:
> >>>>>>> ==========
> >>>>>>> Fatal error: require_once() [function.require]: Failed opening
> >>>>>>> required '../../global.inc' (include_path='.;E:\www\root\') in E:\www
> >>>>>>> \root\utils\logs\logger.inc on line 3
> >>>>>>> ==========
> >>>>>>> That error occurs because
> >>>>>>> 1) "global.inc" is included ("required") into "logger.inc" and
> >>>>>>> "foo.php"
> >>>>>>> 2) "logger.inc" is included into "foo.php"
> >>>>>>> See, foo.php includes its file as "../global.inc" and logger.inc
> >>>>>>> "../../global.inc" (note relative path differs)
> >>>>>>> So if you now try to run "foo.php" the require_once from "logger.inc"
> >>>>>>> would start looking for "global.inc" relatively /root/files which is
> >>>>>>> wrong.
> >>>>>>> My question is... how do I make PHPincludefiles relative to their
> >>>>>>> location not their current "include" directory?
> >>>>>> i know what you mean. there are other solutions but this one was a quick fix
> >>>>>> for me and avoids some other setup/config difference on various systems.
> >>>>>> anyway, i use the following code. if you put it into a file called
> >>>>>> relative.path.php, save the file in your php.ini include_path. from then on
> >>>>>> in all of your scripts, all you have to do is this:
> >>>>>>
> >>>>>> require_once 'relative.path.php';
> >>>>>> require_once $relativePath . 'global.inc';
> >>>>>> ?>
> >>>>>> put that in logger.inc and foo.php and nothing blows up. here's the code for
> >>>>>> relative.path.php:
> >>>>>>
> >>>>>> $parsedUri = dirname($_SERVER['PHP_SELF']);
> >>>>>> $parsedUri .= substr($parsedUri, -1) != '/' ? '/' : '';
> >>>>>> $relativeUri = str_replace('/', '', $parsedUri);
> >>>>>> $relativePath = strlen($parsedUri) - strlen($relativeUri) - 1;
> >>>>>> if ($relativePath < 0){ $relativePath = 0; }
> >>>>>> $relativePath = str_repeat('../', $relativePath);
> >>>>>> if (!$relativePath){ $relativePath = './'; }
> >>>>>> ?>
> >>>>>> hth.
> >>>> Royan,
> >>>> BKdotcom has the right answer. Use $_SERVER['DOCUMENT_ROOT'] to get to
> >>>> the root directory of your site, then refer to everything form there.
> >>>> It works on all sites, and requires no modification the php.ini file.
> >>>> And the beauty of it is, if you have a different location for the root
> >>>> directory on your development site, the code still works in both places.
> >>>> --
> >>>> ==================
> >>>> Remove the "x" from my email address
> >>>> Jerry Stuckle
> >>>> JDS Computer Training Corp.
> >>>> jstuck...@attglobal.net
> >>>> ==================
> >>> FYI, $_SERVER['DOCUMENT_ROOT'] does NOT work on IIS, at least not with
> >>> PHP 5.
> >> It works just fine. I've got it going on my system here and on a
> >> Windows IIS VPS.
>
> >> You just have to have PHP installed as an ISAPI app - not a CGI.
>
> >> BTW - the same it true under Apache, IIRC.
>
> > Unfortunately our server is hosted, so I can't fiddle the install.
> > Also, for a newbie like myself, that would be a fairly arcane bit of
> > knowledge about server install/configuration.
>
> Then get a new host. Anyone who runs PHP as a CGI isn't worth the cost
> of hosting.
>
> > I've been using 'require_once(dirname(__FILE__)."/../
> > someaught.php")'...likely there's some hideous downside to doing it
> > that way, but it certainly has saved me some headaches trying to
> > resolve dependency calls when a file includes a file that includes a
> > file...I tried using Maarten Manders' smartloader class with it's
> > __autoload trick, but couldn't get it to work. :P
>
> > Tyler
>
> Other than the fact you are now path-dependent? That is, you can't move
> the file to another directory without having to modify your code?
>
> And I don't use __autoload. It can have significant overhead.
>
> --
> ==================
> Remove the "x" from my email address
> Jerry Stuckle
> JDS Computer Training Corp.
> jstuck...@attglobal.net
> ==================
mmmm, path dependency...
So, what do you recommend instead, then, that wouldn't use
document_root? Saying 'switch hosts' doesn't help much, as it's not
gonna happen.
Re: Relative paths in require_once problem (possibly all include routines)
am 03.01.2008 16:13:30 von Steve
> mmmm, path dependency...
>
> So, what do you recommend instead, then, that wouldn't use
> document_root? Saying 'switch hosts' doesn't help much, as it's not
> gonna happen.
that's about all you're going to get from jerry. :)
i'll repost this:
$parsedUri = dirname($_SERVER['PHP_SELF']);
$parsedUri .= substr($parsedUri, -1) != '/' ? '/' : '';
$relativeUri = str_replace('/', '', $parsedUri);
$relativePath = strlen($parsedUri) - strlen($relativeUri) - 1;
if ($relativePath < 0){ $relativePath = 0; }
$relativePath = str_repeat('../', $relativePath);
if (!$relativePath){ $relativePath = './'; }
?>
name that whatever you will...say, relative.path.php, for instance. put that
script in your php include_path. from there, it doesn't matter where your
parent script is run. you get document_root in relative terms regardless of
what your server's configuration is. to implement this, just do this at the
top of your parent script:
require_once 'relative.path.php';
include_once $relativePath . 'name of other script to include here';
// rest of code
?>
hth,
me
Re: Relative paths in require_once problem (possibly all include routines)
am 03.01.2008 18:39:56 von Jerry Stuckle
Logos wrote:
> On Jan 2, 9:20 pm, Jerry Stuckle wrote:
>> Logos wrote:
>>> On Jan 2, 3:48 pm, Jerry Stuckle wrote:
>>>> Logos wrote:
>>>>> On Dec 17 2007, 5:27 am, Jerry Stuckle
>>>>> wrote:
>>>>>> Royan wrote:
>>>>>>> Thanks Steve, thats a great idea, i've especially liked that part :)
>>>>>>>>> $relativePath = strlen($parsedUri) - strlen($relativeUri) - 1;
>>>>>>> Unfortunately this approach works great only if you can modify PHP.ini
>>>>>>> but when you are on virtual hosting, the only way you can modify
>>>>>>> settings in PHP.ini is by calling ini_set() function which has to be
>>>>>>> invoced from somewhere. And in my case this "somewhere" is global.inc
>>>>>>> This file is meant to keep all global stuff so it has to be included
>>>>>>> into each and every file in my project, but this is the original
>>>>>>> problem -- i can'tincludeit. Seems to be a vicious circle.
>>>>>>> The only solution i can think of right now is to use the absolute path
>>>>>>> for "global.inc" in each call to require_once. Thus i can put your
>>>>>>> code that calculates relative path in "global.inc" and use it across
>>>>>>> all other files.
>>>>>>> 2BKDotCom
>>>>>>>>> logger.inc doesn't need toincludeglobal.inc as long as global.inc
>>>>>>>>> has been included before logger.inc is included..
>>>>>>> It appears I've made a mistake in my original post. In fact you don't
>>>>>>> have toinclude"global.inc" into foo.php, the error would persist. If
>>>>>>> you wish I can send you test files that replicate the problem
>>>>>>> On Dec 17, 2:30 am, "Steve" wrote:
>>>>>>>> "Royan" wrote in message
>>>>>>>> news:8769e733-17fe-4083-865c-ccd496707023@e25g2000prg.google groups.com...
>>>>>>>>> Ok the problem is quite hard to explain, but i'll try to keep it as
>>>>>>>>> simple as i can. Imagine I have the following structure of my files
>>>>>>>>> and folders:
>>>>>>>>> /root/global.inc
>>>>>>>>> |__/files/foo.php
>>>>>>>>> |__/utils
>>>>>>>>> |__/logs/logger.inc
>>>>>>>>> When I run foo.php I get the following error:
>>>>>>>>> ==========
>>>>>>>>> Fatal error: require_once() [function.require]: Failed opening
>>>>>>>>> required '../../global.inc' (include_path='.;E:\www\root\') in E:\www
>>>>>>>>> \root\utils\logs\logger.inc on line 3
>>>>>>>>> ==========
>>>>>>>>> That error occurs because
>>>>>>>>> 1) "global.inc" is included ("required") into "logger.inc" and
>>>>>>>>> "foo.php"
>>>>>>>>> 2) "logger.inc" is included into "foo.php"
>>>>>>>>> See, foo.php includes its file as "../global.inc" and logger.inc
>>>>>>>>> "../../global.inc" (note relative path differs)
>>>>>>>>> So if you now try to run "foo.php" the require_once from "logger.inc"
>>>>>>>>> would start looking for "global.inc" relatively /root/files which is
>>>>>>>>> wrong.
>>>>>>>>> My question is... how do I make PHPincludefiles relative to their
>>>>>>>>> location not their current "include" directory?
>>>>>>>> i know what you mean. there are other solutions but this one was a quick fix
>>>>>>>> for me and avoids some other setup/config difference on various systems.
>>>>>>>> anyway, i use the following code. if you put it into a file called
>>>>>>>> relative.path.php, save the file in your php.ini include_path. from then on
>>>>>>>> in all of your scripts, all you have to do is this:
>>>>>>>>
>>>>>>>> require_once 'relative.path.php';
>>>>>>>> require_once $relativePath . 'global.inc';
>>>>>>>> ?>
>>>>>>>> put that in logger.inc and foo.php and nothing blows up. here's the code for
>>>>>>>> relative.path.php:
>>>>>>>>
>>>>>>>> $parsedUri = dirname($_SERVER['PHP_SELF']);
>>>>>>>> $parsedUri .= substr($parsedUri, -1) != '/' ? '/' : '';
>>>>>>>> $relativeUri = str_replace('/', '', $parsedUri);
>>>>>>>> $relativePath = strlen($parsedUri) - strlen($relativeUri) - 1;
>>>>>>>> if ($relativePath < 0){ $relativePath = 0; }
>>>>>>>> $relativePath = str_repeat('../', $relativePath);
>>>>>>>> if (!$relativePath){ $relativePath = './'; }
>>>>>>>> ?>
>>>>>>>> hth.
>>>>>> Royan,
>>>>>> BKdotcom has the right answer. Use $_SERVER['DOCUMENT_ROOT'] to get to
>>>>>> the root directory of your site, then refer to everything form there.
>>>>>> It works on all sites, and requires no modification the php.ini file.
>>>>>> And the beauty of it is, if you have a different location for the root
>>>>>> directory on your development site, the code still works in both places.
>>>>>> --
>>>>>> ==================
>>>>>> Remove the "x" from my email address
>>>>>> Jerry Stuckle
>>>>>> JDS Computer Training Corp.
>>>>>> jstuck...@attglobal.net
>>>>>> ==================
>>>>> FYI, $_SERVER['DOCUMENT_ROOT'] does NOT work on IIS, at least not with
>>>>> PHP 5.
>>>> It works just fine. I've got it going on my system here and on a
>>>> Windows IIS VPS.
>>>> You just have to have PHP installed as an ISAPI app - not a CGI.
>>>> BTW - the same it true under Apache, IIRC.
>>> Unfortunately our server is hosted, so I can't fiddle the install.
>>> Also, for a newbie like myself, that would be a fairly arcane bit of
>>> knowledge about server install/configuration.
>> Then get a new host. Anyone who runs PHP as a CGI isn't worth the cost
>> of hosting.
>>
>>> I've been using 'require_once(dirname(__FILE__)."/../
>>> someaught.php")'...likely there's some hideous downside to doing it
>>> that way, but it certainly has saved me some headaches trying to
>>> resolve dependency calls when a file includes a file that includes a
>>> file...I tried using Maarten Manders' smartloader class with it's
>>> __autoload trick, but couldn't get it to work. :P
>>> Tyler
>> Other than the fact you are now path-dependent? That is, you can't move
>> the file to another directory without having to modify your code?
>>
>> And I don't use __autoload. It can have significant overhead.
>>
>> --
>> ==================
>> Remove the "x" from my email address
>> Jerry Stuckle
>> JDS Computer Training Corp.
>> jstuck...@attglobal.net
>> ==================
>
> mmmm, path dependency...
>
> So, what do you recommend instead, then, that wouldn't use
> document_root? Saying 'switch hosts' doesn't help much, as it's not
> gonna happen.
>
Why now? If you can't get what you need from your current host, there
are thousands who will give you want you need.
You could parse the URL being used and count the number of directories
down you are. Then you could parse __FILE__ to get your absolute
directory. Then back up to get to your root directory. But that has
its own problems, and can leave you open to hacking attempts.
--
==================
Remove the "x" from my email address
Jerry Stuckle
JDS Computer Training Corp.
jstucklex@attglobal.net
==================