Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 脚本A中的sleep()是否允许脚本B运行?_Php_Performance_Cpu_Sleep - Fatal编程技术网

Php 脚本A中的sleep()是否允许脚本B运行?

Php 脚本A中的sleep()是否允许脚本B运行?,php,performance,cpu,sleep,Php,Performance,Cpu,Sleep,我有很多脚本,每天运行很多次。一些脚本每5分钟运行一次,另一些脚本每10、15、60分钟运行一次,等等。大多数脚本都处理大量数据,它们在其中循环并处理每一行 我的主机的cron不允许我决定每个脚本的启动时间,我只能选择间隔的分钟数,因此每5分钟运行一次的脚本,运行时间为00,05,10,15。。。 每10分钟运行一次的脚本在00,10,20,30运行。。。 等等 这意味着很多脚本在00开始运行 这其实不是什么问题,只是服务器也被普通用户使用,他们通常只需要做一些不需要花很多时间的事情。但是,如果

我有很多脚本,每天运行很多次。一些脚本每5分钟运行一次,另一些脚本每10、15、60分钟运行一次,等等。大多数脚本都处理大量数据,它们在其中循环并处理每一行

我的主机的cron不允许我决定每个脚本的启动时间,我只能选择间隔的分钟数,因此每5分钟运行一次的脚本,运行时间为00,05,10,15。。。 每10分钟运行一次的脚本在00,10,20,30运行。。。 等等

这意味着很多脚本在00开始运行

这其实不是什么问题,只是服务器也被普通用户使用,他们通常只需要做一些不需要花很多时间的事情。但是,如果他们碰巧在很多脚本运行时这样做,那么一切都会变慢,他们甚至无法在不等待很长时间的情况下完成那些简单的事情

我在某个地方读到,sleep函数将停止CPU处理数据,并允许运行较小的任务。你知道情况是否如此吗?如果我在这些脚本中的每个循环后插入一个sleep(1),这会提高执行小任务的单个用户的性能吗,即允许他们跳过这一行

范例 每5分钟运行一次的脚本

foreach ($a_hundred_things as $one_thing) {
  do_this($one_thing);
  // would adding sleep(1); here improve performance?
}
当用户单击按钮时运行的脚本B

do_this_thing_that_only_takes_a_minute();
目前,如果像脚本a(以及许多其他类似脚本)这样的脚本正在运行,用户有时需要等待很长时间(几分钟)才能运行脚本B。我希望B能够以某种方式优先考虑,因为这是迫不及待的事情,而自动脚本可以承受延迟

在脚本A(以及同时运行的所有其他类似脚本)中添加睡眠(1)会提高性能吗?
我知道我可以试着测试它,但是涉及到很多脚本,而且似乎不是每次都会发生。

首先也是最重要的是,
usleep()
让您指定要睡眠多少微秒,这是一个高级功能

以下是一些难题,但可以帮助您在实施更好的解决方案时减轻打击:

  • 在cron的开头插入几秒钟的随机等待,这样它们就不会同时启动。这可以防止您的机器每15分钟就被完全关闭一次,而所有的东西都在一次初始化

    usleep(mt_rand(0,10000000));
    
  • 贫民区节流。测量执行一次循环迭代所需的时间,然后睡眠那么长时间。实际上,您已将性能减半

    while($condition) {
      $start = microtime(true);
      // do work
      usleep( (microtime(true) - $start) * 1000000) );
    }
    
  • 您应该研究的实际解决方案,请注意,这些解决方案并不是相互排斥的:

  • 将定期/异步任务分配给一台或多台其他计算机。没有理由因为与用户请求没有直接关系的工作而对面向用户的基础架构的性能产生负面影响

  • 异步任务使用队列/工作者模型,并且仅使用cron定期提交作业进行处理。这大致相当于:

  • 创建一个通用的工作进程
  • 设置任务队列。[我推荐与AMQP兼容的队列系统,我个人更喜欢RabbitMQ]
  • 启动一个或多个工作进程,类似Supervisord的功能使保持一小群工作进程运行变得简单

  • 哎呀!你已经实现了这两个?这就是所谓的“水平扩展”,以及我们在2020年如何构建现代应用程序。现在,您可以根据需要启动机器和流程,甚至可以自动启动。很抱歉给您带来不便<代码>:P

    睡眠挂起线程,CPU不在挂起的线程上分配时间。但这种方法会显著增加脚本的运行时间。请将提供程序更改为可以让您更好地控制crontab的提供程序。@EmanuelVintilă感谢您提供的信息。如果用户能够毫不拖延地完成他们的工作,那么增加运行时间也没关系。@MarkusZeller目前不允许这样做。但我曾考虑过使用第三方的cron服务,当可以优雅地完成任务时,这不是一个肮脏的选择。