我正在寻找VB doevents的PHP等价物

时间:2011-07-04 16:49:26

标签: php doevents

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

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

自从我上次在VB中编写任何东西已近10年了,我记得,doevents()函数允许应用程序在密集处理期间屈服于处理器(通常允许其他系统事件触发 - 最常见的是WM_PAINT这样你的UI就不会挂起了。)

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

如果您正在考虑线程(正如大多数Windows程序员所做的那样)并且需要生成多于1​​个脚本实例,那么您应该首先看一下PHP's Process Control functions

答案 2 :(得分:2)

我不完全确定你想要模仿的doevents的哪些方面,所以这里几乎所有对你有用的东西。

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

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

如果您需要允许脚本比平时运行更长时间,则可以使用set_time_limit($time)设置更长的tiemout。如果您需要更多内存,并且可以编辑.htaccess文件,请输入以下代码并编辑值:

php_value memory_limit 64M

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

要一次运行多个脚本,您可以使用pcntl_exec启动另一个正在运行的脚本。

如果我遗漏了一些关于DoEvents()的重要信息,请告诉我,我会尽力帮助您实现它。

答案 3 :(得分:0)

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

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

正如其他人所指出的那样,您需要set_time_limit($something);,或许usleep停止代码运行"太快"如果它每个循环吃掉很多CPU。但是,如果您还使用数据库连接,则大多数脚本时间实际上是等待数据库的脚本(到目前为止,脚本的最大开销)。

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

TL; DR:doevents"烘焙"对PHP而言,你不必担心它。