我正在参与亚马逊产品广告API,他们在条件方面说,我必须至少每小时更新一次数据。好吧,你认为没问题,轻松大规模更新mysql db中的800个对象。但还有另外一点:我只允许每秒进行1次亚马逊查询,所以我想超时每个查询,然后将执行大约15分钟的PHP执行。 所以这对我来说是一个问题,因为我的提供商为PHP脚本配置了20秒的最大执行时间,我无法改变它。
所以我想到了http重定向php脚本给自己。 直到现在再没问题。但现在的问题是:我想要htaccess-password-protect脚本,我的cronjobs提供商可以处理htaccess pw保护。没有任何保护,这将是不安全的,因为如果脚本被滥用,可能会有一些繁重的数据库流量。
问题:是否可以使用php登录htaccess登录对话框,因为没有人可以进行登录过程?或者你还有其他想法来解决这个问题吗?谢谢。
答案 0 :(得分:4)
解决您的初始问题:execution time
您可以设置两个地方。
配置 - 您无法访问或明显更改
运行时 - 我不知道是否有可能禁止在运行时更改最长执行时间
在您的脚本中将此添加到顶部。 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)
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
,以便无法再通过网络访问。