通过另一个PHP脚本异步调用PHP脚本

时间:2014-02-13 22:26:59

标签: php asynchronous shared-hosting

假设我有两个PHP脚本, s1.php s2.php 。我们还假设 s2.php 大约需要30分钟的运行时间。

我想使用 s1.php 异步调用 s2.php 。当 s2.php 被调用时,它将自行运行而不会向 s1.php 返回任何值。 s1.php 不会等待 s2.php 完成; s1.php 会继续执行下一个命令,而 s2.php 会自行启动。

所以这是 s1.php

的伪代码
  1. 做点什么
  2. 致电 s2.php
  3. 继续 s1.php ,而 s2.php 正在运行(此步骤无需等待 s2.php 返回为了继续,它会在 s2.php 开始之后立即启动。
  4. 我该怎么做?

    重要提示:我正在使用共享托管环境

2 个答案:

答案 0 :(得分:0)

开箱即用,PHP不支持异步处理或线程。您最有可能的是排队和/或消息传递。

这可以像在s1.php中的数据库中存储行并在注释中建议的那样在cron上运行s2.php一样简单,该注释读取该数据库,提取新行并执行任何逻辑你需要。

由您来清理 - 确保您不会多次重新处理相同的行。

其他解决方案将使用RabbitMQIronMQ之类的内容。 IronMQ可能是一个值得关注的好地方,因为它是一个基于云的服务,可以在您的共享托管环境中很好地工作,并且它们允许一个“开发层”帐户,该帐户是免费的,并且可能需要更多api调用。< / p>

其他有趣的事情是ReactPHP因为它允许在php中使用非阻塞的io。

答案 1 :(得分:0)

afaik,没有好办法做到这一点:/ 你可以使用proc_open / exec(“nohup php5 s2.php”)〜,或$ cmh = curl_multi_init(); $ CH = curl_init( “https://example.org/s2.php”); curl_multi_add_handle($ CHM,$ CH); curl_multi_exec($ CHM,$ foo的); 虽然(或者如果你没有卷曲,用fopen代替......或者如果allow_url_fopen为false,你甚至可以使用socket_create ~~:/)