[英]How to keep curl session alive between two php processes?
当 php 进程存在时,我可以保存会话并以登录用户身份浏览网站。 那没问题。
这是我的工作代码:
$options = array(
CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; rv:38.0) Gecko/20100101 Firefox/38.0',
CURLOPT_URL => $url,
CURLOPT_HEADER => true,
CURLOPT_VERBOSE => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_REFERER => 'http://website.com/',
CURLOPT_POST => 1,
CURLOPT_POSTFIELDS => http_build_query($post),
CURLOPT_COOKIESESSION => true,
CURLOPT_COOKIEJAR => __DIR__ . '/cookie-name',
CURLOPT_COOKIEFILE => '',
CURLOPT_HTTPHEADER => array(
'Accept: "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"',
'Accept-Language: "en-US,en;q=0.5"',
'Connection: "keep-alive"',
'Cache-Control: "max-age=0"'
)
);
$ch = curl_init();
curl_setopt_array( $ch, $options );
try {
$raw_response = curl_exec( $ch );
if(curl_errno($ch))
throw new Exception(curl_error($ch), 500);
$status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($status_code != 200)
throw new Exception("Response with Status Code [" . $status_code . "].", 500);
} catch(Exception $ex) {
if ($ch != null) curl_close($ch);
throw new Exception($ex);
}
现在我们有$ch
资源可以将它用于其他请求。 但它仍然在一个 php 会话中使用 curl 对象。 如果我需要在不同的 php 进程中使用这个会话怎么办? 是否可以?
不。PHP 基本上是一个无状态的应用程序。 可以通过数据库或内存缓存在其他 php 进程中重用已初始化的数据,但是每次启动新进程时都必须重新初始化资源会话。
如果由于某种原因能够使用同一个会话非常重要,那么您可以考虑编写一个持续运行的守护进程,在后台处理来自 apache 服务器的排队请求,接受和响应来自服务器的请求一个循环。
我想出了它是如何工作的)如果你想保持会话,只需将set-cookie
选项从标头响应复制到某个文件。 之后,您可以使用此 cookie 进行下一次连接。 您不必再次进行授权。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.