运行PHP cronjob超过15分钟

时间:2012-11-27 18:57:14

标签: php .htaccess amazon-web-services crontab

我正在参与亚马逊产品广告API,他们在条件方面说,我必须至少每小时更新一次数据。好吧,你认为没问题,轻松大规模更新mysql db中的800个对象。但还有另外一点:我只允许每秒进行1次亚马逊查询,所以我想超时每个查询,然后将执行大约15分钟的PHP执行。 所以这对我来说是一个问题,因为我的提供商为PHP脚本配置了20秒的最大执行时间,我无法改变它。

所以我想到了http重定向php脚本给自己。 直到现在再没问题。但现在的问题是:我想要htaccess-password-protect脚本,我的cronjobs提供商可以处理htaccess pw保护。没有任何保护,这将是不安全的,因为如果脚本被滥用,可能会有一些繁重的数据库流量。

问题:是否可以使用php登录htaccess登录对话框,因为没有人可以进行登录过程?或者你还有其他想法来解决这个问题吗?谢谢。

3 个答案:

答案 0 :(得分:4)

解决您的初始问题:execution time

您可以设置两个地方。

  1. 配置 - 您无法访问或明显更改

  2. 运行时 - 我不知道是否有可能禁止在运行时更改最长执行时间

  3. 在您的脚本中将此添加到顶部。 set_time_limit会将执行时间设置为无限制,所有其他整数值都以秒为单位

    <?php
    set_time_limit(0);
    

答案 1 :(得分:3)

解决您的第二个问题:以编程方式提供http auth凭证

这只是感兴趣的读者,我不认为(希望你)你需要这个案例

我将发送原始HTTP,这样就可以用于各种客户端和能够打开tcp套接字连接的语言

我的来源:Basic access authentication

<?php
$username = 'myuser';
$password = 'mypass';

// computing authorization digest
$httpAuthDigest = base64_encode( "{$username}:{$password}" );

// connecting to the remote server
$fp = fsockopen( 'www.zappos.com', 80, $errno, $errstr, 60 );
if (!$fp) {
    die( "{$errstr} ({$errno})\n" );
}

// send headers
fputs( $fp, "HEAD /womens-clothing HTTP/1.1\r\n" );
fputs( $fp, "Host: www.zappos.com\r\n" );
fputs( $fp, "Authorization: Basic {$httpAuthDigest}\r\n" );
fputs( $fp, "Connection: close\r\n" );
fputs( $fp, "\r\n" );

// receive result ( optional )
while (!feof($fp)) {
    echo fgets($fp, 128);
}
fclose($fp);

这返回了我知道的最激动人心的响应标题:)

HTTP/1.1 200 OK
Server: nginx/1.1.17
Content-Type: text/html; charset=utf-8
X-ZFC-Metadata: KjYIExIJCgNuaWQSAjQ1EhYKBmxheW91dBIMdGhyZWVfY29sdW1uEg8KA3pjMRIIQ2xvdGhpbmc=
X-Powered-By: Ponies!
X-Varnish-TTL: 60m
X-Varnish: 248743314 248742997
X-Cache-Hits: 4
X-Varnish-Host: varnish04.zappos.net
X-Varnish-ID: drupal
X-Core-Value: 5. Pursue Growth and Learning
X-Recruiting: If you're reading this, maybe you should be working at Zappos instead.  Check out jobs.zappos.com
X-UUID: 9dc901f6-38ca-11e2-be29-00145e157f03
Cache-Control: max-age=3085
Date: Tue, 27 Nov 2012 19:50:38 GMT
Connection: close

答案 2 :(得分:1)

OP表示他在特定时间后仍然会超时,但会将配置的max_execution_time覆盖为无限制,这是根据phpinfo()

工作的

认为通过浏览器调用worker script是不好的做法。 这可能导致无法控制的状态,并引起其他问题,就像你现在正在经历的那样 - 除了可能的麻烦,这可能会导致其他人把URL拿到手中。

另外 - 每小时导入在浏览器中手动执行是非常不舒服的吗?

你的问题是,由于超时而不是php停止执行,而是网络服务器。 你说你没有传递任何GET或POST参数。只需在命令行上的php-cli上运行它

php yourscript.php

所有输出都将记录到控制台中。如果你愿意,你可以将它写入像这样的日志文件

php yourscript.php > log.txt

这仍然不会自动执行任何操作。 在任何unix上,您都可以在所需的时间和间隔轻松设置为您完成此任务的cronjob

e.g。

crontab -e

编辑您配置的cronjobs

* */2 * * * /usr/bin/php /yourpath/yourscript.php > ~/yourlog.txt 2>/dev/null

这将每两个小时运行一次,并将您的脚本输出记录到~/yourlog.txt,将错误重定向到/dev/null

选中此项以了解计划表的工作原理 http://www.adminschoice.com/crontab-quick-reference

我还建议将您的脚本移出您的网络服务器document root,以便无法再通过网络访问。