gpt4 book ai didi

php - 异步执行 php-script 正在使用经过身份验证的 session

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:39:17 24 4
gpt4 key购买 nike

我正在尝试异步运行脚本。在 Stackoverflow 上找到如何做到这一点没有问题。问题是我正在尝试我发现的示例之一,但它不起作用。尽管脚本运行时不会在 error_log 中输出错误。

我的 main-php 脚本:

function backgroundPost($url){

$parts=parse_url($url);

$fp = fsockopen($parts['host'],
isset($parts['port'])?$parts['port']:80,
$errno, $errstr, 30);


if (!$fp) {
return false;
} else {
$out = "POST ".$parts['path']." HTTP/1.1\r\n";
$out.= "Host: ".$parts['host']."\r\n";
$out.= "Content-Type: text/plain\r\n";
$out.= "Content-Length: ".strlen($parts['query'])."\r\n";
$out.= "Content-Length: ".strlen($parts['query'])."\r\n";
$out.= "Connection: Close\r\n\r\n";
if (isset($parts['query'])) $out.= $parts['query'];

fwrite($fp, $out);

fclose($fp);

return true;
}
}

//Example of use
backgroundPost('http://192.168.1.107/smic/testarea/runner.php?id=1');

fwrite() 的响应是“155”。

backgroundPost 返回“真”。

runner.php:

ignore_user_abort(true);
set_time_limit(50);
error_log("RUNNING!");

怎么会出现“RUNNING!注释写入错误日志?就像 scipt 没有实际执行一样。

当直接访问 runner.php(使用在 backgroundPost 中发布的 URL)时,脚本按预期工作。

这两个脚本都具有 apache:apache 的权限 777。

正在运行

  • Linux/CentOS 6.2
  • PHP 5.3.3
  • Apache 2.2.15

这是否与我使用的是经过身份验证的 session 有关,而经过身份验证的用户当然不是运行脚本的 apache?

使用 CURL 进行测试

@jprofitt 建议我也尝试了 curl:

async_curl.php:

$ch = curl_init("http://192.168.1.107/");
$fp = fopen("http://192.168.1.107/smic/testarea/runner.php", "r");

curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC ) ;
curl_setopt($ch, CURLOPT_USERPWD, "kaand:xIWGWt0DNVriw");
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);

curl_exec($ch);
$info = curl_getinfo($ch);
echo print_r($info);
curl_close($ch);
fclose($fp);

这是从 curl_getinfo($ch) 打印出来的:

Array
(
[url] => http://192.168.1.107/
[content_type] => text/html; charset=UTF-8
[http_code] => 302
[header_size] => 411
[request_size] => 103
[filetime] => -1
[ssl_verify_result] => 0
[redirect_count] => 0
[total_time] => 0.002165
[namelookup_time] => 0.000106
[connect_time] => 0.000192
[pretransfer_time] => 0.000211
[size_upload] => 0
[size_download] => 0
[speed_download] => 0
[speed_upload] => 0
[download_content_length] => 0
[upload_content_length] => 0
[starttransfer_time] => 0.002109
[redirect_time] => 0
[certinfo] => Array
(
)

[redirect_url] => http://192.168.1.107/login.php
)
1

我确实尝试过 $ch = curl_init("http://192.168.1.107/");同样,然后我在我的网站上收到消息“需要授权”。在 error_log 中,我得到 HTTP/1.1 401 Authorization required for running.php。

在执行“curl_setopt($ch, CURLOPT_FILE, $fp);”时,我也确实在 error_log 中收到有关 $fp“不是有效的文件句柄资源”的投诉。

在数组的末尾有一个重新定向到登录页面,这可能与那个问题有关吗?

最佳答案

因此,我遇到的问题与 runner.php 的限制区域有关。无论我使用 curl 还是 fsockopen,我都需要对请求进行身份验证。这里我包含fsockopen和curl对限制区域做异步请求的解决方案。

fsockopen:

function backgroundPost($url){        

$parts=parse_url($url);
echo $parts['path']."<br/>";
echo $parts['host']."<br/>";
echo $url;

$fp = fsockopen($parts['host'],
isset($parts['port'])?$parts['port']:80,
$errno, $errstr, 10);

$auth = base64_encode("kaand:kaand123");
if (!$fp) {
return false;
} else {
$out = "POST ".$parts['path']." HTTP/1.1\r\n";
$out.= "Host: ".$parts['host']."\r\n";
$out.= "User-Agent: Anonymous\r\n";
$out.= "Content-Type: text/plain\r\n";
$out.= "Authorization: Basic ".$auth;
$out.= "Content-Length: ".strlen($parts['query'])."\r\n";
$out.= "Connection: Close\r\n\r\n";
if (isset($parts['query'])) $out.= $parts['query'];

fwrite($fp, $out);

fclose($fp);

return true;
}
}

使用示例:

backgroundPost('http://192.168.1.107/smic/testarea/runner.php?id=1');

curl :

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "http://192.168.1.107/smic/testarea/runner.php");
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC ) ;
curl_setopt($ch, CURLOPT_USERPWD, "kaand:kaand123"); //Don't use the sha1-value
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);

curl_exec($ch);
curl_close($ch);

runner.php

do whatever...

我想我会选择 fsockopen,认为这是一个比强制您至少有一些等待时间的超时更好的解决方案。如果有很多流量甚至 1 秒就可以建立...

关于php - 异步执行 php-script 正在使用经过身份验证的 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9735874/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com