1)Php中exec怎么异步,不等待执行完成就下一个行代码
2)sleep问题前后两个echo输出,访问页面时,前面的echo没有立刻显示在页面上,而且等所有php执行后页面才显示所有echo内容。
具体可观看视频连接我的问题,记得音量调节。
由于视频有40多秒,上传不了cdns,所以我把它发布在了我的服务器url。
视频视频描述问题:
https://mayizt.com/d.mp4
exec
函数默认是同步执行的,即会等待命令执行完成后才会继续执行下一个行代码。如果你希望异步执行命令,可以使用 &
符号将命令放在后台运行。例如:exec('your_command > /dev/null 2>&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)”语句