exec php 执行不了怎么办
程序员文章站
2022-03-07 12:52:42
...
exec php执行不了的解决办法:1、修改yii文件首行,直接指明php解释器;2、修改exec调用方法,直接指明php解释器。
本文操作环境:Windows7系统、PHP7.1版、Dell G3电脑。
php exec 为何执行不了?
缘起
有一个定时任务,想在 OSS 后台管理页面可以点击启动,可是试了几种方法都不行;无论 system 还是 exec(手工在 shell command line 执行没问题);最初怀疑 Web Server nginx 用户的权限问题,后来发现是环境变量找不到 php 可执行文件(因为 nginx 用户是受限用户);
问题定位
exec("/home/app/example/api/app/yii demand/virtual {$id}", $output); print_r($output);
以上脚本执行后仅输出 Array()
,显然是没有执行到业务代码(业务代码的第一行就有输出);
// http://oss.example.com/index.php?r=demand/demand-ip/msg&id=1929 点击后执行 exec("/home/app/example/api/app/yii demand/virtual {$id} 2>&1", $output); print_r($output);
以上脚本执行后有错误输出:Array ( [0] => /usr/bin/env: php: No such file or directory )
;
/usr/bin/env: php
这句话出自 yii 文件的首行 #!/usr/bin/env php
,本意是用于指明执行 yii 文件的 php 脚本解释器在哪里;可是错误输出/usr/bin/env: php: No such file or directory
说明找不到 php 在哪里;
【推荐学习:《PHP视频教程》】
解决方案
- 方案一:修改 yii 文件首行,直接指明 php 解释器;
由#!/usr/bin/env php
修改为#!/usr/local/bin/php
,即直接指明 php 解释器所在位置(在代码发布时修改也可以); - 方案二:修改 exec 调用方法,直接指明 php 解释器
exec("/usr/local/bin/php /home/app/example/api/app/yii demand/virtual {$id} 2>&1", $output); print_r($output);
- 注意:在实际执行中,exec 命令还有点问题,见下文 “504 错误”;
504 错误
- 当 exec 时间执行过长时(如超过 60 秒),页面上会出现 504 错误(Gateway Timeout);
- 需要将标准输出、标准错误重定向,然后就会在 后台进程执行命令,页面上会输出处理进程号;
$cmd = '/usr/local/bin/php /home/app/example/yapp/yii demand/finish 2057'; $pid_file = 'msgrepeat.pid'; $exec_cmd = sprintf("%s > /dev/null 2>&1 & echo $! > %s & cat %s", $cmd, $pid_file, $pid_file); exec($exec_cmd);
关于 /usr/bin/env(可移植性高?)
- Why is it better to use “#!/usr/bin/env NAME” instead of “#!/path/to/NAME” as my shebang?
- How does /usr/bin/env know which program to use?
nginx 用户
为安全起见,通常设置 nginx 用户的 shell 为 /sbin/nologin
定时任务和 Web 操作的关系?
定时任务和 OSS 后台管理页面上的点击操作之间的关系处理的一直不太好;
- yii 框架 console 和 web 的两种处理方式;
如何提升 crontab 可测试性的问题;
如何改善 crontab 使用体验的问题;
如何合理复用 crontab 任务和 API(Controller/Action)代码的问题; - 前台和后台共享 Controller/Action 的方式;
或者说多项目之间方便共享代码库的问题;
启示
- php-fpm does not work exec, system, shell_exec, only CLI;
- PHP exec() does not run all commands;
以上就是exec php 执行不了怎么办的详细内容,更多请关注其它相关文章!
推荐阅读
-
PHP启动windows应用程序、执行bat批处理、执行cmd命令的方法(exec、system函数详解)
-
laravel执行php artisan migrate报错怎么办
-
crontab执行不了php的解决办法
-
php在服务器执行exec命令失败的解决方法
-
crontab执行不了php的解决办法
-
linux - PHP shell_exec() system() 执行 unzip 不成功
-
php 在linux 下 执行exec无效,
-
php利用exec执行shell脚本有关问题
-
gitlab-php-webhook - gitlab webhook php exec 调用 shell 脚本。shell 脚本中调用 git pull 命令无法执行。
-
centos - php 用 exec 执行Linux命令时,返回 127 错误码