Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
异步运行外部php代码_Php_Multithreading_Web Services_Asynchronous_Fork - Fatal编程技术网

异步运行外部php代码

异步运行外部php代码,php,multithreading,web-services,asynchronous,fork,Php,Multithreading,Web Services,Asynchronous,Fork,我正在使用PHP构建一个Web服务: 基本上 用户通过HTTP请求向服务器发送请求。”php’,即 服务器异步启动php代码。”更新.php',即 与用户的连接已完成 代码“update.php”仍在运行,并将在一段时间后完成 代码“update.php”已经完成 问题在于php异步运行某些外部代码 可能吗?还有别的办法吗?与shell_exec合作 求你了,我需要洞察力!最好是优雅的方式 谢谢大家! 您可以使用PHP构建服务。 或者使用bash:系统(“PHP myScript.PHP par

我正在使用PHP构建一个Web服务:

基本上

  • 用户通过HTTP请求向服务器发送请求。”php’,即
  • 服务器异步启动php代码。”更新.php',即
  • 与用户的连接已完成
  • 代码“update.php”仍在运行,并将在一段时间后完成
  • 代码“update.php”已经完成
  • 问题在于php异步运行某些外部代码

    可能吗?还有别的办法吗?与shell_exec合作

    求你了,我需要洞察力!最好是优雅的方式


    谢谢大家!

    您可以使用PHP构建服务。
    或者使用bash:
    系统(“PHP myScript.PHP param param2&”)启动一个PHP脚本
    您可以使用PHP构建一个服务。
    或者使用bash:
    系统(“PHP myScript.PHP param param2&”)启动一个PHP脚本
    最好的方法是使用消息队列,比如RabbitMQ,甚至是简单的MySQL表

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


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

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

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


    它还可以帮助您随着时间的推移分配负载,防止您自己的脚本引起的DoS。

    使用Redis resque或gearman查看工作进程

    使用Redis resque或gearman查看工作进程

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

    同时,查找指定的特殊GET变量,并在出现时调用
    ignore\u user\u 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';
    
    }
    
    ?>
    

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

    同时,查找指定的特殊GET变量,并在出现时调用
    ignore\u user\u 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';
    
    }
    
    ?>
    
    
    
    您可以分叉一个进程,exec()一个外部程序并将其置于后台,或者在某个级别上让ignore\u user\u abort()忽略。您可以分叉一个进程,exec()一个外部程序并将其置于后台,或者在某个级别让ignore\u user\u abort()忽略。确保实现一些逻辑来检查作业是否已经在运行,您不希望在旧作业完成之前继续启动新作业,并使服务器陷入困境。请确保实现一些逻辑来检查作业是否已在运行,您不希望在旧作业完成之前不断启动新作业并使服务器陷入困境。命令末尾的
    &
    意味着在单独的线程中启动新作业,这样您的php脚本就不会挂起。UNIX解决方案为+1。但是我在寻找一个跨操作系统的解决方案,然后使用这个:对于php作为服务的使用,我有过类似的体验,我必须发送短信,用户会上传一个csv文件:
    phone\u number;短信
    我将启动脚本一次,在
    while 1
    循环中,从
    sleep(n)
    开始,我将检查目录中的任何文件,如果有,读取第十行,从文件中删除它们,并发送十条短信。命令末尾的
    &
    意味着在单独的线程中启动此命令,这样您的php脚本就不会挂起。UNIX解决方案为+1。但是我在寻找一个跨操作系统的解决方案,然后使用这个:对于php作为服务的使用,我有过类似的体验,我必须发送短信,用户会上传一个csv文件:
    phone\u number;短信
    我会启动脚本一次,在
    while 1
    循环中,从
    sleep(n)
    开始,我会检查目录中是否有任何文件,如果有,读取前十行,从文件中删除它们,然后发送十条短信。