异步运行外部PHP代码

时间:2014-02-28 17:55:26

标签: php multithreading web-services asynchronous fork

我正在使用PHP构建WebService:

基本上,

  1. 用户通过HTTP请求向服务器发送请求。 'request.php',即。
  2. 服务器异步启动php代码。 'update.php',即。
  3. 与用户的连接已完成。
  4. 代码'update.php'仍然在运行,并且会在一段时间后完成。
  5. 代码'update.php'已完成。
  6. 问题在于php以异步方式运行一些外部代码。

    这可能吗?还有另一种方法吗?用shell_exec?

    拜托,我需要见解!优雅的方式更可取。

    谢谢!

4 个答案:

答案 0 :(得分:2)

最好的方法是使用像RabbitMQ这样的消息队列,甚至是简单的MySQL表。

每次在前端控制器中添加新任务时,它都会进入队列。然后由cron job运行的update.php从队列中获取,处理,保存结果并将任务标记为已完成。

此外,它还可以帮助您随着时间的推移分配负载,防止由您自己的脚本导致的DoS。

答案 1 :(得分:1)

您可以使用PHP构建服务。 或者使用bash:system("php myScript.php param param2 &")

启动PHP脚本

答案 2 :(得分:1)

您可以让用户连接到update.php,生成某种唯一ID以跟踪进程,然后使用特殊的GET变量调用fsockopen(),以表示它正在进行繁重的工作而不是用户互动。立即关闭该连接,然后向用户打印出相应的响应。

同时,查找您指定的特殊GET变量,并在出现时调用ignore_user_abort()并继续执行if子句的该分支中所需的任何操作。所以这里是你的update.php文件的粗略框架:

<?php

if ( isset($_GET['asynch']) ) {

    ignore_user_abort();

    // check for $_GET['id'] and validate,
    // then execute long-running code here

} else {

    // generate $id here

    $host = $_SERVER['SERVER_NAME'];
    $url = "/update.php?asynch&id={$id}";

    if ( $handle = fsockopen($host, 80, $n, $s, 5) ) {
        $data = "GET {$url} HTTP/1.0\r\nHost: {$host}\r\n\r\n";
        fwrite($handle, $data);
        fclose($handle);
    }

    // return a response to the user
    echo 'Response goes here';

}

?>

答案 3 :(得分:0)

使用Redis resque或gearman

查看工作进程