如何使 php 脚本运行另一个 php 脚本

14
我正在尝试用PHP做与之前我的Python问题完全相同的事情。从之前的(已回答)问题中查看
之前的PHP脚本会执行某些操作,然后在同一台服务器上运行另一个PHP脚本,执行某些操作,然后退出(而第二个脚本仍在继续工作)。我该如何实现这一点?
请注意,PHP脚本同时也是一个网页(因此也许我们可以像在先前的问题中那样使用它,即回答我的问题的代码片段只需使python打开网址而不是运行子进程...虽然我不知道这是否有用的信息,或许在PHP中有所不同,我在PHP方面没有太多经验),并且每个脚本都要独立 - 因此,如果第一个PHP脚本完成,我希望第二个PHP脚本继续工作,即使第一个脚本已经结束
您认为最优雅的方式是什么?输出iframe是否可以起到作用,还是我应该以不同的方式完成这个任务?
9个回答

18

您可以尝试通过 shell 在后台启动另一个 PHP 进程。这有点像是一种技巧,不适用于所有操作系统,并且可能在共享网络服务器上无法运行。

file1.php

<?php
$somearg = escapeshellarg('blah');
exec("php file2.php $somearg > /dev/null &");   

file2.php

<?php
//do some stuff that will take a while
//$argv should contain 'blah', and also it seems the name of the php file
//this script will continue to run. You might want to set max_execution_time to a sensible value.

5
你可以在first.php的末尾放置header('Location: second.php');,并在second.php的末尾再次放置以执行third.php等等。甚至可以在两个脚本之间创建循环,即在完成first.php后,将启动second.php,再次执行second.php之后是first.php,以此类推。

但请记住,这是一个依赖浏览器的特性,可以依赖浏览器重定向的次数来无限制地执行脚本。我发现Mozilla允许23次重定向,这意味着你可以依次执行23个脚本。


3
在同一服务器上运行第二个脚本:
$appUrl = $_SERVER['HTTP_HOST'];
$path = 'second.php';//your path here
$appUrl = 'http://'.$appUrl.'/'.$path;
file_get_contents($appUrl);

1
file_get_contents只是获取文件的内容,对吗?它如何帮助执行文件呢?如果我错了,请纠正我,抱歉,我正在学习。 - Anirudh M
是的 - 我同意.. file_get_contents 只是获取了文件的文本内容.. 它并没有执行它。 - jcansell
1
如果您获得了网页的内容,那就意味着它已经被执行了。 - user889030

2
如果用户将使用Web浏览器来访问php脚本,我会使用ajax调用第二个页面。
用户甚至不知道它正在被调用。
请参阅w3schools上的AJAX教程。

4
Stack Overflow需要自动将w3schools替换为MDN。https://developer.mozilla.org/en/docs/AJAX - David Gilbertson
不好,因为基本上只是一个链接答案,没有解释如何使用ajax从php脚本调用另一个php脚本。 - Andrew

2
如果您需要运行其他脚本,依赖于客户端并不明智。我会使用这个StackOverflow问题中描述的技术(指向PHP文档中这个评论),将其他脚本包含在您的后处理中。然而,该评论是在2006年撰写的,自那时以来可能发生了变化。请尝试一下这种技术(就像我一样,只是为了好玩),看看它是否适用于您 :)

1
据我所知,除了AJAX之外,没有任何方法可以运行第二个页面。就我所知,PHP不支持多线程(如果我错了,请纠正我),而Web的“单线程”特性似乎也无法解决这个问题。
我更倾向于查看您的具体应用程序,并找出为什么需要运行两个单独的页面,然后重新设计该过程,使其不再需要两个页面。
我敢打赌,重新设计将从开发的角度以及逻辑和实现的角度来看都会减少头痛的情况。

1

这个方法在Apache上工作吗?文档(http://us2.php.net/manual/en/function.pcntl-fork.php#49949)上的评论说不行,但是其他人说“有点用”。 - Matchu
此外,ignore_user_abort 只涉及到用户按下停止,而不是脚本自己提前关闭连接。 - Matchu
不,pcntl_fork在mod_php下无法工作。OP没有指定脚本是用于Web还是CLI。 - shadowhand

0
如果您的远程脚本可以通过http作为简单的网页访问,您可以尝试使用http get请求的变体,其中响应超时设置为最小时间,例如通过CURL:
if( $curl = curl_init() ) {
  curl_setopt($curl, CURLOPT_URL, 'http://your_site/your_script.php');
  curl_setopt($curl, CURLOPT_TIMEOUT, 1);
  curl_exec($curl);      
  curl_close($curl);
}

但是这样你的第一个脚本执行会有1秒的延迟。


0

我在尝试让之前的答案工作时遇到了麻烦,虽然我怀疑这可能是我的服务器的问题,或者新的浏览器拒绝在指示时关闭连接(我真的不是很懂这些东西的工作原理)。

如果这种方法对您也不起作用,请尝试PHP中的伪多线程文章,看看是否能够更好地运行 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接