当前位置: 首页 > 知识库问答 >
问题:

PHP exec或shell_exec在linux中脚本执行结束后不终止其进程

壤驷高旻
2023-03-14

我正在尝试使用shell命令检查php文件的语法错误,它在Windows(WAMP)中运行良好,但在linux上,由shell命令exec/shell_exec/popen等创建的进程从未终止,从而导致apache挂起,而这个进程被我强制终止。此外,在终止进程后也不会生成任何输出。

我的测试脚本是

文件测试。php是仅用于测试的一行php文件示例,其中包含

<?php
$test['arr'] = 'bla';
?>

我用来检查语法错误的代码是:

$slash = file_get_contents('test.php');
$tmpfname = tempnam("tmp", "PHPFile");
file_put_contents($tmpfname, $slash);
exec("php -l ".$tmpfname." 2>&1",$error); //also tried shell_exec but same behaviour
$errtext = '';  
foreach($error as $errline) $errtext.='<br>'.$errline;
unlink($tmpfname);
echo $errtext;

还尝试使用函数popen

$slash = file_get_contents('test.php');
$tmpfname = tempnam("tmp", "PHPFile");
file_put_contents($tmpfname, $slash);
$handle = popen("php -l ".$tmpfname." 2>&1", 'r');
$errtext = fread($handle, 2096);
pclose($handle);
unlink($tmpfname);
echo $errtext;

请有人告诉我哪里做错了,为什么在linux中由shell命令创建的进程永远不会结束,我尝试了很多关于这个问题的搜索,但没有得到任何结果。

共有1个答案

严柏
2023-03-14

我得到了阻塞问题的根本原因,这是PHP会话,它阻止了来自同一用户在linux服务器上的所有其他请求(令人惊讶的是,在windows上它工作得很好)。

我使用了session_write_close();在运行exec并解决问题之前,现在我在linux中遇到了这个脚本的另一个问题,在另一个问题中发布了php exec/shell_exec/system/popen/proc_open runs在linux上无限次调用脚本本身

 类似资料:
  • 问题内容: 我正在遵循本指南http://doc.scrapy.org/en/0.16/topics/practices.html#run-scrapy-from- a-script 从我的脚本中运行scrapy。这是我脚本的一部分: 它的工作原理应该是:访问页面,抓取所需信息,并将输出json存储在我告诉它的位置(通过FEED_URI)。但是,当蜘蛛完成他的工作(我可以在输出json中通过数字看

  • 当我试图使用执行PHP脚本时,它不起作用。 在错误日志文件中显示: PHP警告:shell_exec()[function.shell exec]:无法执行'PHP/home/snabsam/public_html/。。。。。 系统 Centos shell_exec与clamscan配合使用 与clamav的功能配合使用 但它没有执行PHP脚本 我检查过的东西: PHP是off 不存在于在php

  • 问题内容: 我正在写一个如下的shell脚本: 现在,我想要实现的是列出$ ACTIONS_DIR中的每个文件以执行该文件。$ ACTIONS_DIR下的每个文件都是另一个Shell脚本。 现在,这里的问题在于,使用exec之后,脚本将停止并且不会转到下一个文件。任何想法为什么会这样? 问题答案: 替换shell进程。如果只想将该命令作为子进程调用,则将其删除。

  • 按“Reload this page”可以运行其余的代码,甚至提交表单,就像按F8“Continue”一样。 更新: 当脚本暂停时按F5(刷新)时: null null 有点进步! 调试时导航到同一页: Chrome V31:与刷新相同。 IE 11:脚本被终止,新的浏览器会话开始(与关闭和再次打开相同)。 Firefox V26:什么都没有发生。 Chrome开发工具终于添加了一个适当的方法来停

  • 问题内容: 我想在控制台上键入: 在终止之前执行脚本。那可能吗? 问题答案: docker stop命令首先尝试通过向容器中的根进程(PID 1)发送SIGTERM信号来停止正在运行的容器。如果该进程在超时时间内仍未退出,则将发送SIGKILL信号。 实际上,这意味着您必须定义一个ENTRYPOINT脚本,该脚本将拦截(捕获)SIGTERM信号并执行适当的任何关闭逻辑。 样本入口点脚本可能如下所示

  • 问题内容: 我知道中的命令会尽早停止脚本。 如何在Python中执行此操作? 问题答案: sys模块文档中的详细信息: 从Python退出。这是通过引发SystemExit异常来实现的,因此可以执行 try语句的finally子句指定的清除操作,并且有可能在外部级别拦截出口尝试。 可选参数arg可以是给出退出状态的整数(默认为零),也可以是其他类型的对象。如果它是整数,则shell等将零视为“成功