我有一些长期运行的CLI PHP脚本,它们通过cron定期运行。我希望他们能够尽快完成但不会严重影响其他流程(例如Web服务器响应)。
目前我正在使用
运行脚本nice -n 19
并且还尝试插入非常短的usleep()调用,例如在我的主循环中插入50微秒。在单核VM上,这并不总是像我想的那样快速地产生。顺便说一下,我没有让RAM饱和,所以没有发生分页。
我已经读过usleep()是一个系统调用,它允许调度程序在需要时比我没有任何系统调用更快地为其他进程分配优先级。
我想知道的是,如果有更好的方法在PHP中执行此操作。比如一个不睡觉但立即产生优先权的电话。
另外,我知道其他语言比PHP更有效,但这是用Symfony + Doctrine编写的更大应用程序的一部分。我不想分成多种语言而失去应用程序模型的业务逻辑优势。
答案 0 :(得分:2)
如果nice
没有为您剪切,请考虑为您的内核选择不同的调度程序。这是您的操作系统优先处理过程的问题。在您的应用程序中,您无法轻松解决这些问题(无论是用PHP还是其他任何语言编写的)。
哦,请记住,nice
级别并没有真正开始,除非你正在挨饿CPU周期。如果你的CPU大部分处于空闲状态,那么即使是一个级别为19的进程也可以吃掉它想要的所有CPU周期。
编辑:事实上,在沿着这条路走下去之前一定要确保你受CPU限制。如果您的I / O绑定,则CPU优先级不会产生太大影响。
答案 1 :(得分:1)
一般来说Linux非常保守。但你可以试试schedtool和libmlock。后者是在内存中锁定php以避免交换。你也可以尝试交换,因为它非常高。您也可以尝试用积极的cflags自己编译php,甚至尝试使用英特尔C编译器(我已经出售许可证)。 IMO schedtool和nice一样好,但有一些变量。
答案 2 :(得分:1)
“睡了0次”通常是“立即控制”的最好方法。其他方法通常需要在内核模式下运行(甚至内核模式也可能被硬件中断抢占,具体取决于)。
使用“0睡眠时间”,进程(或线程)将被安排“再次执行”[near] future中的某些点 - 确切的保证是系统特定的。实际睡眠的最小分辨率取决于环境和系统配置(一般来说,它不会真正“0次”)。在非实时系统(例如Linux或Windows)上通常无法保证产生的确切时间 - 调度程序将按照自己的意愿执行。
快乐的编码。
答案 3 :(得分:0)
也许你可以重写部分应用程序,以便在PHP之外使用命令行工具(不需要你的应用程序逻辑)。
例如,假设您要导入一个大的XML文件。您可以尝试使用CLI工具xsltproc
将XML文件转换为CSV格式,而不是使用PHP完成所有操作,这样可以为您提供一个更轻松的PHP文件。
答案 4 :(得分:0)
我知道这不是主要目的,但是没有参数的 yield 关键字不会有效地导致处理器让步给其他进程吗?我一直认为这就是它被称为 yield 的原因。