在“后台”中运行功能

时间:2010-01-02 22:07:18

标签: php

物件:

  • 对象销售
  • n对象用户将参与对象销售
  • 每个用户都可以创建一个对象代理
  • 每个代理将为对象Sale
  • 生成n个对象许可(不时且有一些条件)

目标:

创建一个功能,当销售只剩下5秒时,将检查所有代理商是否有此销售,并从尚未对此次销售获得许可的代理商发布最长的

这是需要持续运行的事情,因为这些代理商负责在发布许可证时替换用户,允许他们在拍卖期间离开。

我的问题

更新(我的问题不够明确):

在销售的索引页面,我有一个带有javascript的脚本,用于计算销售剩余的时间,因此我可以知道销售何时应该调用该功能来检查代理商并出价,但我的新手问题是:如果我在这个页面上调用该函数,这只有在用户打开页面时才有效吗?或者,如果他关闭,该功能将不再被调用?因为即使用户关闭网页,我仍然需要这个。 DaMacc已经回答说这不起作用

更新(05/01/2010)

我已经创建了这个功能。该功能将查找剩下5秒钟的所有销售,然后它将搜索所有代理商,然后从未在所选销售中获得许可的代理商处出价最长。现在我需要每秒调用此函数。我打算使用 cron ,但 cron有1分钟的界限 。我需要此功能在服务器上运行,而不依赖于拥有代理的用户。

有什么建议吗?

PS:有一些拍卖网站有这种投标我正在尝试做的事情,我可以让一个人用作例子......但我不确定我是否允许这样做... 。:S

感谢。

4 个答案:

答案 0 :(得分:4)

创建您的正常函数来执行您需要执行的任何操作,然后使用类似cron的内容将其设置为每X个时间运行一次的任务。

编辑以扩展评论

在这种情况下,您可能最好结合一些解决方案。正如this question中提到的,我建议您每分钟使用cron调用一个脚本,并在该脚本中循环运行您的进程。

需要考虑的一些事项:

  • 每次执行需要多长时间?
  • 您是否需要在每个循环结束时使用time_sleep_until,或者您的脚本运行时间超过1秒,在这种情况下,您需要从cron多次调用该脚本。
  • 请务必跟踪脚本运行的时间,因为您不希望每分钟占用越来越多的资源,因为前一分钟的脚本尚未完成

在脚本开始时,记下当前时间,然后在每个循环开始时,检查自脚本启动后是否已经过了一分钟,如果有,则退出脚本(如另一个脚本将现在感谢cron)。

希望这会有所帮助。让我知道如果这没有多大意义,我会尝试清理一下。

答案 1 :(得分:2)

我想知道这是不是你要找的东西:

function execInBackground($cmd) {
    if (substr(php_uname(), 0, 7) == "Windows") {
        pclose(popen("start /B ". $cmd, "r"));
    } else {
        exec($cmd . " > /dev/null &");
    }
}

然后,您可以使用以下方法在后台启动php进程:

execInBackground("php path/to/file.php " . $param01 . " " . $param02);
// where $param01 and $param02 are optional values that you may want to
// send to the page. Equivalent to GET parameters of URL.
// You can include as many parameter values as you want.

//Example:
execInBackground("php automation/bidChecker.php daniel 53.25");
// automation/bidChecker.php is the file to be executed
// daniel can be the username
// 53.25 can be the bid value

在后台运行的PHP文件中,您可以使用以下方法访问参数值:

$param01 = $argv[1]; // assigns daniel as value
$param02 = $argv[2]; // assigns 53.25 as value

当用户执行某些操作时,可以从脚本运行中启动此过程。即使用户离开页面,它也将继续运行,直到您以编程方式中断操作。

我真的不知道这是不是你要找的东西。如果是这样,你现在就明白了。

答案 2 :(得分:1)

使用队列,例如Zend_Queue:http://framework.zend.com/manual/en/zend.queue.html。只需运行无限循环(或两个)并分派从Web应用程序发送的消息

答案 3 :(得分:0)

您是否考虑过使用Javascript?如果您有某些事件触发了运行此检查的需要,那么可能就是这样。

您可以编写一个js函数,包含在每个使用setInterval/clearInterval javascript函数的页面上,每隔几秒就向服务器发送一个AJAX请求,并根据条件是否可以向浏览器发送不同的响应是否满足。 (但带宽可能是一个问题)

我建议查看jQuery并使用它的AJAX函数。