Php异步exec和sleep延迟问题

1)Php中exec怎么异步,不等待执行完成就下一个行代码
2)sleep问题前后两个echo输出,访问页面时,前面的echo没有立刻显示在页面上,而且等所有php执行后页面才显示所有echo内容。
具体可观看视频连接我的问题,记得音量调节。

由于视频有40多秒,上传不了cdns,所以我把它发布在了我的服务器url。
视频视频描述问题:
https://mayizt.com/d.mp4
  1. 在 PHP 中,exec 函数默认是同步执行的,即会等待命令执行完成后才会继续执行下一个行代码。如果你希望异步执行命令,可以使用 & 符号将命令放在后台运行。例如:
exec('your_command > /dev/null 2>&1 &');

这样会将命令放在后台运行,并且不会等待其执行完成。

  1. 关于 sleep 函数的问题,sleep 函数会暂停当前脚本的执行指定的秒数。当你在 PHP 中使用 echo 输出内容时,内容实际上是被缓存起来的,并不会立即发送到浏览器。只有当整个脚本执行完毕后,才会将缓存的内容一次性发送到浏览器进行显示。

如果希望在页面上实时显示输出内容,可以使用 flush 函数来刷新输出缓冲区。例如:

echo 'Output 1';
flush();
sleep(5);
echo 'Output 2';
flush();

这样,在输出第一个 echo 后调用了 flush() 函数,可以立即将缓存的内容发送到浏览器进行显示。然后再进行 sleep(5) 暂停 5 秒钟,最后再输出第二个 echo 并调用 flush() 刷新缓冲区。

你看看这个:https://www.qycn.com/xzx/article/14421.html

问题1示例代码

<?php
// 使用 `&` 符号将命令放入后台执行
exec('your_command > /dev/null 2>&1 &');
// 继续执行下面的代码,而不等待命令执行完成
?>

问题2示例代码

<?php
ob_end_flush(); // 关闭输出缓冲区,立即发送输出给客户端
echo 'Hello, World!';
ob_start(); // 开启输出缓冲区,继续将输出缓冲
// 此时的输出内容会在后面的代码执行完成后发送给客户端
?>
每一次解答都是一次用心理解的过程,期望对你有所帮助。
参考结合AI智能库,如有帮助,恭请采纳。

1、可以使用 passthru 函数代替 exec,这样就可以在执行命令时立即返回,而不等待命令完成。例如:
exec('command &', $output);
2、如果在 PHP 代码中使用 sleep 函数,会导致整个 PHP 脚本暂停执行,直到 sleep 函数执行完毕。这会导致前面的 echo 语句无法立即显示在页面上,而要等到整个 PHP 脚本执行完毕后才会显示所有 echo 内容。要解决这个问题,可以使用 JavaScript 的 setTimeout 函数来延迟输出结果,例如:
echo "<script>setTimeout(function(){document.write('Hello World');}, 5000);</script>";

You to declare it as a reference:

function init(&$x) {
  $x = 0;
}
$a = 42;
init($a);
echo $a; // 0

This behavior is described in the PHP manual. It's the second paragraph of function arguments: Making arguments be passed by reference

在PHP中,使用exec()函数执行外部命令是同步的,也就是说PHP将会等待外部命令执行完毕后才会继续执行下面的代码。如果你需要实现异步执行外部命令的功能,可以使用proc_open()函数结合stream_set_blocking()stream_set_timeout()函数进行操作。

下面是一个使用proc_open()函数异步执行外部命令并设置延迟的示例:

$descriptorspec = array(
    0 => array('pipe', 'r'),  // 标准输入,如果需要传递数据给子进程
    1 => array('pipe', 'w'),  // 标准输出
    2 => array('pipe', 'w')   // 标准错误
);

$process = proc_open('your_command', $descriptorspec, $pipes);

if (is_resource($process)) {
    // 设置输出管道为非阻塞模式
    stream_set_blocking($pipes[1], false);
    stream_set_timeout($pipes[1], 0);

    while (!feof($pipes[1])) {
        // 读取输出
        echo fgets($pipes[1]);

        // 做一些其他的操作
        // ...

        // 让进程休眠一段时间
        sleep(1);
    }

    // 关闭管道和进程
    fclose($pipes[1]);
    proc_close($process);
}

在上述示例中,your_command是你要异步执行的外部命令,你可以将其替换为你实际需要执行的命令。

通过stream_set_blocking()函数将输出管道设置为非阻塞模式,并通过stream_set_timeout()函数将超时时间设置为0,以便立即读取输出而不会阻塞进程。

然后,使用一个循环来读取输出并执行其他操作。在每次循环中,你可以根据实际需要做一些其他处理,并使用sleep()函数设置延迟,以控制输出的速度和执行的间隔。

请注意,在使用异步方式执行命令时,需要注意处理命令的输出和错误,以及适当地管理资源,确保进程的正确关闭和资源的释放。

希望这个示例能帮助到你解决PHP异步执行外部命令和延迟的问题。

参考 https://blog.csdn.net/sapodilla/article/details/104053829

php exec或system函数异步执行
在cli模式下,必须要使用&和指定输出(重定向到/dev/null),让命令行异步执行。例如:

<?php
    $cmd = 'php  test.php  >/dev/null  &';
    exec($cmd);
    $cmd = 'php test.php   >/dev/null  &';
    system($cmd);
?>

延迟的
实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句