PHP - exec() - putenv() - PATH - CodeIgniter

时间:2012-02-19 21:02:44

标签: php codeigniter exec

我已经在PHP中下载了一个免费的占星术脚本。脚本通过表单(出生日期和时间,经度,纬度等)接收一些数据,然后运行此命令,其参数由变量传递:

exec ("swetest -edir$sweph -b$utdatenow -ut$utnow -p0123456789DAttt -eswe -house$my_longitude,$my_latitude,$h_sys -flsj -g, -head", $out);

Linux的可执行文件'swetest'文件位于以下目录中:'sweph'位于站点的根目录以及其他一些带有数据的二进制文件。这些二进制文件是'Swiss Ephemeris',它决定了行星在hor-oscope轮子中的位置。 然后将该命令的输出($ out)存储在变量中,执行一些计算,最后,星座轮由GD库生成。

在我的桌面上运行Windows和XAMP,我的远程服务器是Linux。我已将主机的PHP版本设置为5.3.something。

我已按照提供的说明将脚本上传到我的主机上(完全没有Code Igniter),并且运行完美且没有问题。这意味着我的主机已正确配置以运行exe()命令。

现在我尝试将此脚本改编为CodeIgniter。 我将二进制文件放在http://example.com/codeIgniterSite/assets/sweph中。 “swetest”命令的第一个参数是-edir,它决定了二进制文件的位置,我把它设置为'assets / sweph'(我已经设置了基础href ='http://example.com/codeignitersite'页面标记)。 我检查了传递给参数的值($ utnow,$ my_latitude等),它们是有效的。 问题是Code Igniter环境忽略exec命令,$ out变量保留为空。然后,在执行exec()命令后执行计算而不正确设置变量时,页面会出现错误。

第一个错误与命令有关:

$swephsrc = ‘assets/sweph’;
putenv("PATH=$PATH:$swephsrc")
脚本放在exec()上面的

,错误是:'Undefined variable:PATH'。

所以这一定是我想的问题。 Code Igniter必须有自己的系统来执行putenv所做的事情。那就是添加环境路径的路径。有人可以帮忙吗? 我必须说当我尝试在本地运行脚本(没有CI)时,它产生的错误与具有CI的远程主机中的错误完全相同。它不接受putenv。但这可能是因为我的文件不是本地二进制文件,而它们在主机上是二进制文件,因为我根据脚本作者网站上的说明以二进制模式上传文件。

我还运行了以下内容:

echo exec ("swetest -edir$sweph -b$utdatenow -ut$utnow -p0123456789DAttt -eswe -house$my_longitude,$my_latitude,$h_sys -flsj -g, -head", $out, $error);
echo $error.'<br/>';
echo exec('whoami', $out, $error);
echo $error.'<br/>';

第一个$ error输出'127',表示'找不到文件或其他'。 第二个输出我的名字,'0'表示'一切顺利'。因此,Code Igniter exe可以使用'whoami'命令,因为它可以找到它,而它不知道'swetest'命令的位置。 那么如何使用CI添加环境路径的路径?还是别的什么?

编辑:我试过:     $ PATH = 0; 之前:     运行putenv( “PATH = $ PATH:$ swephsrc”) 它工作了!执行二进制文件并用数据填充变量。唉!我的幸福并没有持续很久......我开始收到“内部服务器错误”:-(。我不知道这是巧合还是与我的行为有关。

5 个答案:

答案 0 :(得分:1)

有时会有各种Web服务器需要不同的编译版本的swetest(如果你得到行星位置的所有零,你的服务器可以正确运行exec命令)。要在本地Windows机器上运行(比如使用XAMPP),你需要swetest.exe,而不是最甜蜜的 - 最甜的只适用于Linux。

答案 1 :(得分:0)

您已提供有关该问题的足够信息,以显示exec()命令未在正确的目录中执行。试试这个;

exec('pwd');

并将其添加到原始问题中,它可以帮助其他人。

此外,如果它位于不正确的目录中,请执行

exec('ls');

然后找到合适的文件夹(assets / sweph?),然后尝试

exec('cd assets'); # Replace assets with the name of the folder
exec('ls'); # List things in the folder

检查可执行文件是否在目录中,如果是,则每次启动脚本时都必须使用“exec('cd assets')”,以确保exec位于正确的目录中

答案 2 :(得分:0)

解决方案是:

exec ("/absolute/path/to/executable/swetest -edir$sweph -b$utdatenow -ut$utnow -p0123456789DAttt -eswe -house$my_longitude,$my_latitude,$h_sys -flsj -g, -head", $out);

答案 3 :(得分:0)

我知道,这已经是一个已经回答的问题了,我已经遇到过这个问题了,我想,我知道你想用什么剧本。

当脚本引用它时,

$PATH未初始化。所以解决方案是

$PATH = getenv('PATH');

答案 4 :(得分:0)

似乎您是在指我编写的PHP脚本。如果您有问题,请访问我的网站astrowin.org,然后给我发送电子邮件。

您需要在Linux服务器上使用swetest(并且可能需要为Linux计算机正确编译的特定版本的swetest)。您需要在Windows计算机上使用swetest.exe。这两个文件不相同,但是功能相同。