在 PHP 中 sleep 和 usleep 的行为是不是不同?

Posted

技术标签:

【中文标题】在 PHP 中 sleep 和 usleep 的行为是不是不同?【英文标题】:Do sleep and usleep behave differently internally, in PHP?在 PHP 中 sleep 和 usleep 的行为是否不同? 【发布时间】:2017-08-17 16:23:00 【问题描述】:

我有一个套接字服务器监听传入数据的连接并在输入暂停期间写入传出数据。由于这是一个循环,因此我正在调用sleep 以允许其他进程有一些 CPU 时间,而我的进程并不期待立即输入。

我知道sleep 会这样做,但usleep 是否也将执行返回给操作系统?我很怀疑,因为我知道,传统上,sleep 系统调用只接受几秒钟,而我十年前读过的一本关于 C 编程的非常古老的书说,要“休眠”较短的时间间隔涉及像制作无限循环这样的黑客攻击本质上是模拟sleep 调用,但不会将 CPU 时间让给其他进程。 (这本书可能错了,也可能不再准确,我只是告诉你它所说的。)

我使用的是 Linux,php 版本 5.6 和 7.1

谢谢

【问题讨论】:

我怀疑是操作系统级别的。 man7.org/linux/man-pages/man3/usleep.3.html 你可以测试一下。使用 usleep(10000) 并观察你的 CPU 负载。 您可以使用selectpoll 等待输入到达。您的程序将响应更快并使用更少的 CPU。 【参考方案1】:

它依赖于平台,但在 Linux 上你可以使用这个简单的脚本来测试:

$start = microtime(true);

while(true)
        while(microtime(true) - $start < .9)


//while(true)
//      usleep(900000);
//

第一次使用php test.php &amp; top -d 0.1 运行它以观察错误sleep 的样子,在检查完top 后终止生成的php 进程,注释掉第一个while 循环并取消注释第二个循环,重新- 运行脚本并记录 CPU 使用率。

感谢 Halcyon 给了我自己测试的想法。

【讨论】:

以上是关于在 PHP 中 sleep 和 usleep 的行为是不是不同?的主要内容,如果未能解决你的问题,请参考以下文章

PHP 暂停函数 sleep() 与 usleep() 的区别

Linux的sleep()和usleep()的使用和区别

sleep()和usleep()

sleep()和usleep()的使用和区别

在我的 Qt 应用程序中,我可以用啥来代替 sleep 和 usleep?

linux下的sleep()和usleep()的使用和区别