当shell调用时,PHP system()调用不起作用

时间:2017-12-18 14:50:58

标签: php linux shell

我有一个由cron运行的shell文件:

* * * * * /bin/sh /var/www/test.sh > /dev/null 2>&1

该文件只包含以下行:

php -q /var/www/test.php

该php文件包含:

<?php
$command = 'cairosvg -f pdf -o /var/www/test.pdf /var/www/test.svg';
system($command);
$command = 'mkdir /var/www/test_dir';
system($command);
file_put_contents('var/www/test_user.log', posix_getpwuid(posix_geteuid())['name']);
if (file_exists('/var/www/test.pdf')) {
    file_put_contents('/var/www/test.log', 'success');
} else {
    file_put_contents('/var/www/test.log', 'fail');
}

cairosvg是一个CLI库,可将SVG文件转换为PDF。如果我完成上述步骤,则会运行此PHP代码,但不会创建该文件。如果我通过URL调用PHP文件,则会创建该文件。

我看到的唯一区别是流程用户posix_getpwuid(posix_geteuid())['name']在按网址运行时为www-data,在由shell运行时为root

当我在终端中以root身份运行它时,命令cairosvg -f pdf -o /var/www/test.pdf /var/www/test.svg有效。

第二个命令mkdir /var/www/test_dir只是一个现实检查,以确保为CLI启用system()或其他非常简单的东西。该命令适用于shell和URL。

这是一个关于更复杂系统问题的最小,完整和可验证的例子,因此“跳过shell步骤”或类似的答案对我来说不会有什么帮助。

我正在运行PHP 5.6,Ubuntu 14.04和Apache。

当我通过shell调用而不是通过URL调用时,为什么这个PHP代码失败?

1 个答案:

答案 0 :(得分:0)

在评论中归功于Nico Haase,pomaxa和kvantour。

system()返回状态给出127.这表示用户(root)无法识别cairosvg命令。我将/usr/bin/cairosvg符号链接到/usr/local/bin/cairosvg,这让一切正常。

shell内部root无法访问cairosvg local的原因是 CRON下的explained here在受限制的环境中运行命令

  

可用的环境变量可能非常有限。通常,您只会定义一些变量,例如$ LOGNAME,$ HOME和$ PATH。