2011-12-22 80 views
1

我需要创建一个事件监听器。我是一个新手,所以要友好:)在PHP中创建事件监听器,等待XML内容

基本上我在page1.php(php文件);我想在一个循环内检查page2.xml(xml文件)的某些信息,这些信息应该在某个时间点被接收。要么一直检查它,要么等待,每隔5分钟左右看看是否收到了一些信息。他们中的任何一个都适合我。

如果几分钟后没有收到任何信息,那么我想再次运行循环(直到它被接收到),否则,向前移动并用我新收到的信息做一些事情。这部分我没有问题,只是事件监听器本身。我无法在任何地方找到我应该使用的功能。 :(我只需要经常检查和检索xml文件的内容

我不太确定我应该如何去解决这个问题,如果不是只有一个这样做的函数,当我搜索“事件监听器的php”时,找到很多东西。

任何帮助将不胜感激:参考教程/示例代码/甚至只是告诉我什么关键字我应该寻找或我需要先学习什么要做到这一点。

谢谢!

+0

该文件如何更新?它是否在你的服务器上,其他脚本正在更新它,还是你从其他服务器上拉它?您是在谈论服务器上长时间运行的PHP脚本还是关于网站/客户端的轮询? – deceze 2011-12-22 01:22:07

+0

这个xml文件正在被外部服务器更新,但它位于我的服务器上 - 与php文件一样。 – 2011-12-22 01:36:52

+0

我不确定什么是“长时间运行的PHP脚本”或“轮询”,或者它们之间有什么区别。这基本上是一个外部的API,它更新我的XML文件。我的PHP脚本应该运行,直到它收到这些信息并对它做了一些事情,然后它可以停止。此外,这不必在网站上提供输出(尽管可以)。这可能只是在一个由页面触发的php页面中,并且现在正在运行(如果甚至可以的话) – 2011-12-22 01:39:40

回答

1

我做了以下内容:

自动保存到数据库中每一次新的东西进来

然后跑了PHP的循环,每隔几分钟检查,看看是否存在符合该数据库的一些新的东西。这个新事件的参数(包括它发生在过去几分钟的时间范围内)。我在循环中使用了flush();,然后使用sleep(120);来让循环每隔几分钟继续运行,直到新信息进入,在这种情况下,它将会break();die();

1

哦,首先你要了解你所使用的术语。PHP是不是一个事件驱动语言,它是一种请求驱动的语言。一个请求进入Web服务器,PHP解析它并将响应发送回请求者。在任何时候都不会触发您可以处理或处理的事件。你可以实现你自己的“事件系统”,但最终这比你的用例需要更多的工作。

您最好的选择是使用AJAX并不断向PHP脚本发出请求,直到您返回您正在查找的数据。最终,您需要了解JavaScript对象XMLHttpRequest。在了解如何利用JavaScript进行异步请求之后,您可以查看setInterval()方法以了解如何重复发出请求。

一旦您可以重复发出异步请求,它应该是一个相对简单的创建网页的过程,您可以在其中触发要发送的AJAX请求。


在您的PHP代码中不需要循环。循环在另一端有效完成。以下是您可能遵循的文本工作流程:

  1. 转到旨在触发您的AJAX调用并触发它们的站点。
  2. 向您的PHP脚本发出异步请求。
  3. 在您的PHP脚本中打开XML文件并检查必要的内容。
  4. 以JSON对象的形式返回响应。一个响应可能意味着数据未更新,另一个响应则意味着数据已更新。
  5. 如果未从步骤(2)重复更新数据,则解析响应。如果数据更新继续步骤(6)。
  6. 显示您的数据已更新的庆祝问候语或通知我们仍在等待数据更新。也许你也可以尝试一些尝试,偏离一边。
+0

好酷我知道如何使用ajax,我在其他地方使用了jquery的ajax功能,我只是认为,因为这是php循环的一部分,它是不可能的?那么我应该从php循环中间运行一个脚本? – 2011-12-22 02:09:21

0

我做了这样的事情,在PHP中编写收件箱解析器。你最好的选择是:

代码page1.php中,你只需要做两件事情:从page2.xml和 读取XML,如果有什么“新”只是执行数据分析 代码。

设置一个Cron工作(如果你在linux下)每5分钟执行一次(Cron命令类似于:php /path/to/page1.php)。同样,如果你正在运行Windows,你可以设置一个计划任务并执行相同的命令。请注意,PHP安装的完整路径应该在PATH环境变量中。

+0

我可以设置cronjob作为php环路的一部分在page1.php中运行吗?我认为这种情况并不像工作无限期运行的收件箱,我只需要用户触发此循环,然后运行1-5次,直到xml中出现新内容,然后完全停止。用cronjob可以吗? – 2011-12-22 02:30:32

+0

@LucyWeatherford是的,我认为应该可以使用'shell_exec'来管理cron作业(即创建并启动一个作业,每五分钟运行五次)。 – gremo 2011-12-22 02:45:15