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

PHP exec/shell_exec/system/popen/proc_open在linux上无限次运行调用脚本本身

柯星辰
2023-03-14

我有一个脚本,它使用php-l检查php文件中的语法错误。它在windows中工作正常,但在Linux中输出不正确:

文件exec_ip的内容。正在检查语法错误的php是(它有要检查的语法错误):

<?php
$arr['12] = 'asd';
?>

剧本是:

$slash = file_get_contents('exec_ip.php');
//echo $slash;
$tmpfname = tempnam("tmp", "PHPFile");
file_put_contents($tmpfname, $slash);
exec("php -l ".$tmpfname,$error);

$errtext = '';      
foreach($error as $errline) $errtext.='<br>'.$errline;          
unlink($tmpfname);
echo 'ERR:'.$errtext;

窗口(WAMP){更正}中的结果:

ERR:

Parse error: syntax error, unexpected T_STRING, expecting ']' in C:\WINDOWS\Temp\PHP1F1.tmp on line 2

Errors parsing C:\WINDOWS\Temp\PHP1F1.tmp

LINUX(Centos/cPanel){未知输出}中的结果:

ERR:
Content-type: text/html

ERR:
Content-type: text/html

ERR:
Content-type: text/html

ERR:
Content-type: text/html

ERR:
Content-type: text/html

ERR:
Content-type: text/html

ERR:
Content-type: text/html

ERR:
Content-type: text/html

ERR:
... too many same above lines

请有人帮助我,并告诉我为什么它在linux生产服务器中给出了不正确的输出。我也尝试过用shell_exec、popen、proc_open和system来代替exec,但它们都有相同的行为。我正试图追踪过去两天的根本原因。。。请帮忙

编辑:有时我会在第5行的/home/user/public_html/exect.PHP中看到以下错误日志“PHP警告:exec():无法分叉[PHP-l/tmp/PHPFileI4T43l]。我认为它是在递归exec命令本身,在每个递归上创建一个新的进程,但无法找到它的原因。

共有1个答案

印辉
2023-03-14

经过2天的头痛和大量的谷歌搜索...我找到了解决方案在链接http://www.mombu.com/php/php-5-forum/t-24759-exec-or-system-et-all-cause-an-infinite-loop-of-starting-requested-program-8469354.html

这是PHP CGI版本,它从环境中读取脚本名,从而导致调用脚本运行无限次,或者直到允许的最大进程数,或者直到整个内存被消耗。

解决方案是简单地使用命令php cli而不是命令php。

我在代码中替换了下面的行

exec("php -l ".$tmpfname,$error);

具有

exec("php-cli -l ".$tmpfname,$error);

现在一切都好了。

我希望它能帮助别人。我还更改了这个问题的标题,以便其他人可以在谷歌上轻松找到相同问题的解决方案。

 类似资料:
  • 问题内容: 我有一个在Linux上运行的Python(3)脚本,称为主脚本,该脚本必须从专有DLL调用例程。到目前为止,我已经使用Wine使用以下结构解决了这个问题: 脚本 dll_call.py 由Wine下安装的Windows Python(3)解释器执行。它将返回值转储到一个文件中,然后由等待的主脚本拾取该文件。如果我必须连续执行几次,它不是完全可靠且令人痛苦的缓慢。 我想一次启动脚本 dl

  • 我必须在IE 10浏览器上运行Selenium测试。为了运行以下脚本,我执行了以下操作: > 从这里下载了IEDriverServer(64位,因为我的机器是64位) 将该(. exe)文件放在“C://驱动程序”文件夹中 设置路径'C://驱动程序'在环境变量 运行脚本 运行 aboe 脚本会导致以下错误: 同样的脚本在Chrome和Firefox浏览器上运行良好。请帮助我理解我做错了什么。

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

  • 问题内容: 我完全不熟悉Greasemonkey,JavaScript,实际上是所有UI东西。 要求:页面加载后,用户脚本由GS运行一次。但是,我需要多次运行同一脚本而不刷新 用例:例如,Amazon.com搜索使用Ajax进行。我需要在搜索结果中嵌入自定义元素。 每次在同一页面上进行搜索时,我都需要将内容和结果一起注入到search-results-div中(没有页面刷新) 我当前的脚本仅在页面

  • 我有一个daml文件,只有一个脚本 有没有办法在我运行的任何时候执行脚本?

  • 问题内容: 每次在Linux中保存文件时如何运行脚本? 问题答案: Linux有一个子系统调用inotify,它可以使文件系统向应用程序报告文件系统中的更改。 您的linux系统可能有一个名为的软件包,使使用变得非常容易。(或在可用的软件包中搜索描述中包含“ inotify”一词的任何软件包)。 设置非常类似于setup ,除了在指定的时间和日期执行脚本,每当指定的文件或目录更改时执行脚本。 PS