PHP exec 函数运行不正常

PHP exec function does not work well

首先使用windows.

我有以下代码:

index.php

<?php
    error_reporting(E_ALL);
    $tiempo_inicio = microtime(true);
    exec('C:\wamp\bin\php\php5.5.12\php.exe -e C:\wamp\www\mail.php  > /dev/null &');  
    $tiempo_fin = microtime(true);
    echo ($tiempo_fin - $tiempo_inicio);
    ?>

Mail.php

<?php
$tiempo_inicio = microtime(true);
    $logs = fopen("test.txt","a+"); 
    sleep(2);
    $tiempo_fin = microtime(true);
    fwrite($logs, ($tiempo_fin - $tiempo_inicio)."
    "); 
    sleep(4);
    $tiempo_fin = microtime(true);
    fwrite($logs, ($tiempo_fin - $tiempo_inicio)."
    ");
    sleep(6);
    $tiempo_fin = microtime(true);
    fwrite($logs, ($tiempo_fin - $tiempo_inicio)."
    ");
    echo 'fin';
?>

但我希望它不起作用,因为我想要的是运行后台文件而不需要用户等待这个文件完成。

我做错了什么?

你说的是非阻塞执行(一个进程不等待另一个进程。PHP真的不能很好地做到这一点(无论如何),因为它是围绕单个线程设计的.不知道你的过程是做什么的我不能准确地评论这个但是我可以提出一些建议

  • 考虑通过 AJAX 异步执行。将您的脚本与 Javascript 结合可以让客户端执行请求并让您的 PHP 脚本 运行 自由,而 AJAX 打开另一个不会阻止 activity 的请求] 在主页上。一定要让用户直观地知道您正在等待数据
  • pthreads (repo)- 多线程 PHP。在另一个线程中打开另一个进程。
  • Gearman - 类似于 pthreads 但也可以自动化
  • cron job - 完全异步。定期运行进程。考虑到它可以进行数据聚合,并且您的脚本会获取聚合数据

我过去在 Windows 上使用 pclose/popen 和 Windows 启动命令而不是 exec 取得了成功。这样做的缺点是很难对您调用的程序中的任何错误做出反应。

我会尝试这样的事情(我今天不在机器上测试):

$command_string = 'C:\wamp\bin\php\php5.5.12\php.exe -f "C:\wamp\www\mail.php" -- variablestopass';

pclose(popen("start /B ".$command_string, 'r'));