1

我正在寻找 VB doevents 的 PHP 等效项。我用VB编写了一个实时分析包,并使用doevents发布到操作系统。Doevents 允许我留在内存中并连续运行而不会填满内存,并允许我响应用户输入。我已经用 PHP 重写了这个包,我正在寻找同样的 doevents 功能。如果它不存在,我可以重新安排自己并退出。但我目前不知道该怎么做,我认为这会增加更多的开销。谢谢你,杰拉德

4

4 回答 4

3

usleep 是您正在寻找的.. 在给定的微秒数内延迟程序执行 http://php.net/manual/en/function.usleep.php

于 2012-02-03T03:27:39.203 回答
2

我不完全确定您要模拟 doevents 的哪些方面,所以这里几乎所有可能对您有用的东西。

您可以ob_implicit_flush(true)在脚本顶部使用来启用隐式输出缓冲区刷新。这意味着无论何时您的脚本调用echoprint任何您用来显示内容的东西,PHP 都会自动将其全部发送到用户的浏览器。您也可以ob_flush()在每次调用后使用来显示某些内容,这更像是Application.DoEvents()在 VB 中保持您的 UI 处于活动状态,但必须在每次输出某些内容时调用。

自然,如果您的脚本已经使用了输出缓冲区,您可以在刷新之前构建缓冲区的副本,使用ob_get_contents().

如果您需要让脚本运行比平时更长的时间,您可以使用set_time_limit($time). 如果您需要更多内存,并且您有权编辑 .htaccess 文件,请放置以下代码并编辑值:

php_value memory_limit 64M

这将内存限制设置为 64 兆字节。

对于一次运行多个脚本,您可以使用pcntl_exec启动另一个运行。

如果我遗漏了有关 DoEvents() 的一些重要内容,请告诉我,我会尽力帮助您使其正常工作。

于 2011-07-04T17:52:47.297 回答
2

自从我上次在 VB 中编写任何东西以来已经快 10 年了,我记得,doevents() 函数允许应用程序在密集处理期间让步给处理器(通常是为了允许其他系统事件触发 - 最常见的是 WM_PAINT 以便您的UI 不会出现挂起)。

我不认为 PHP 具有这样的功能 - 您的脚本将作为单个进程运行并结束(当它完成或当它达到默认的 30 秒超时时)。

如果您正在考虑线程(大多数 Windows 程序员倾向于这样做)并且需要生成超过 1 个脚本实例,那么也许您应该先看看PHP 的进程控制函数

于 2011-07-04T17:18:27.343 回答
0

PHP 专为异步按需处理而设计。然而,它可以被迫成为一个有点骇客的后台任务。

由于 PHP 作为单线程运行,因此您不必担心让 CPU 执行其他已经处理好的事情。如果不是这种情况,那么 Web 服务器一次只能提供一个页面,所有其他请求都必须排在队列中。您将需要编写某种在某些可检测条件发生之前永不过期的外观(例如您在数据库中设置的“现在请退出”消息或其他内容)。

正如其他人所指出的那样,如果每个循环占用大量 CPU,您可能需要set_time_limit($something);停止usleep代码运行“太快”。但是,如果您还使用数据库连接,则大部分脚本时间实际上是等待数据库的脚本(迄今为止脚本的最大开销)。

我已经看到通过使用屏幕创建的 PHP 工作线程并将其分离到后台任务。只要您没有会超时或退出的会话(例如当 Web 浏览器关闭时),其他方法也可以工作。启动脚本以检查脚本是否每 x 分钟或小时运行一次的 cron 可让您从强制存在和/或系统重新启动中自动恢复。

TL;DR:doevents 被“融入”到 PHP 中,您不必担心它。

于 2015-06-20T22:53:11.370 回答