2

我参与了亚马逊产品广告 API,他们在条件条款中说,我必须至少每小时更新一次数据。好的,您认为没问题,轻松批量更新 mysql db 中的 800 个对象。但还有一点:我只能每秒进行 1 次 Amazon 查询,所以我想使每个查询超时,这将使 php 执行持续大约 15 分钟。所以这对我来说是个问题,因为我的提供商为 php 脚本配置了 20 秒的最大执行时间,我无法更改它。

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

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

4

3 回答 3

4

解决您最初的问题:执行时间

有两个地方可以设置。

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

  2. 运行时- 我不知道有任何可能禁止更改运行时的最大执行时间

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

<?php
set_time_limit(0);
于 2012-11-27T19:20:56.317 回答
3

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

这只是为感兴趣的读者准备的,我认为(希望你)在这种情况下不需要这个

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

我的来源:基本访问身份验证

<?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
于 2012-11-27T19:51:14.643 回答
1

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

认为worker script通过浏览器调用 a 是不好的做法。这可能会导致无法控制的状态并导致其他问题,就像您现在遇到的问题一样 - 除了当其他人将 URL 掌握在他手中时可能导致的问题之外。

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

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

php yourscript.php

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

php yourscript.php > log.txt

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

例如

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,以便不再从网络上访问它。

于 2012-11-28T18:56:09.860 回答