PHP exec函数不能很好地工作

时间:2016-04-15 11:42:22

标签: php html powershell exec

首先使用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';
?>

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

我做错了什么?

2 个答案:

答案 0 :(得分:1)

你所说的是一个非阻塞执行(一个进程不会在另一个进程上等待.PHP真的不能很好地执行它(原生反正)因为它是围绕一个线程设计的。不知道你的进程是什么我不能准确评论这个,但我可以提出一些建议

  • 考虑通过AJAX进行异步执行。将脚本与Javascript结合使客户端可以执行请求,并让您的PHP脚本自由运行,同时AJAX打开另一个不阻止主页上活动的请求。请确保让用户直观地知道您在等待数据
  • pthreadsrepo) - 多线程PHP。在另一个线程中打开另一个进程。
  • Gearman - 与pthread类似,但也可以自动化
  • cron job - 完全异步。定期运行一个进程。考虑一下,它可以做数据聚合和你的脚本提取聚合数据

答案 1 :(得分:0)

我过去在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'));