【问题标题】:PHP - exec() - putenv() – PATH - CodeIgniterPHP - exec() - putenv() - 路径 - CodeIgniter
【发布时间】:2012-02-19 21:02:43
【问题描述】:

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

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

“swetest”文件是 Linux 的可执行文件,位于站点根目录的“sweph”目录以及其他一些包含数据的二进制文件中。这些二进制文件是“瑞士星历”,它确定了行星在星座轮中的位置。 然后将该命令的输出($out)存储在变量中,执行更多计算,最后由 GD 库生成星座轮盘。

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

我已按照提供的说明将脚本完全按照下载的方式上传到我的主机(在没有 Code Igniter 的情况下单独),并且它可以完美运行而没有问题。这意味着我的主机已正确配置为运行 exe() 命令。

现在我尝试将此脚本改编为 CodeIgniter。 我将二进制文件放在 http://example.com/codeIgniterSite/assets/sweph 中。 “swetest”命令的第一个参数是 –edir,它确定二进制文件的位置,我将其设置为 'assets/sweph'(我在页面标签)。 我检查了传递给参数的值($utnow、$my_latitude 等),它们是有效的。 问题是 Code Igniter 环境忽略了 exec 命令并且 $out 变量为空。然后页面会充满错误,因为执行 exec() 命令之后的计算是在没有正确设置变量的情况下执行的。

第一个错误与命令有关:

$swephsrc = ‘assets/sweph’;
putenv("PATH=$PATH:$swephsrc")

脚本位于 exec() 之上,错误是:“未定义变量:PATH”。

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

我还运行了以下命令:

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 执行“whoami”命令可能是因为它可以在不知道“swetest”命令在哪里的情况下找到它。 那么如何使用 CI 为环境路径添加路径呢?还是别的什么?

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

【问题讨论】:

  • 你项目的目标是什么?我也在用这个工具,也许我想联系你。

标签: php codeigniter exec


【解决方案1】:

有时有不同的 web 服务器需要不同的编译版本的 swetest(如果你的行星位置全为零并且你的服务器可以正确运行 exec 命令)。要在本地 Windows 机器上运行(例如使用 XAMPP),您需要 swetest.exe,而不是 swetest - swetest 仅适用于 Linux。

【讨论】:

    【解决方案2】:

    解决办法是:

    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】:

      您已经提供了足够的信息来说明 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 在正确的目录中

      【讨论】:

      • 非常感谢您的回答。这些命令非常有用。我现在不能尝试它们,因为我在 putenv 命令之前添加了 $PATH = 0。 exec() 工作但过了一段时间我开始收到“内部服务器错误”并且脚本停止响应。
      【解决方案4】:

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

      $PATH 在脚本引用它时未初始化。所以解决方案是

      $PATH = getenv('PATH');
      

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 2011-07-26
          • 1970-01-01
          • 2011-12-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-06
          相关资源
          最近更新 更多