Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Any way to keep curl's cookies in memory and not on disk

I'm doing some cURL work in php 5.3.0.

I'm wondering if there is any way to tell the curl handle/object to keep the cookies in memory (assuming I'm reusing the same handle for multiple requests), or to somehow return them and let me pass them back when making a new handle.

Theres this long accepted method for getting them in/out of the request:

curl_setopt($ch, CURLOPT_COOKIEJAR, $filename);  curl_setopt($ch, CURLOPT_COOKIEFILE, $filename); 

But I'm hitting some scenarios where I need to be running multiple copies of a script out of the same directory, and they step on each others cookie files. Yes, I know I could use tempnam() and make sure each run has its own cookie file, but that leads me to my 2nd issue.

There is also the issue of having these cookie files on the disk at all. Disk I/O is slow and a bottle neck I'm sure. I dont want to have to deal with cleaning up the cookie file when the script is finished (if it even exits in a way that lets me clean it up).

Any ideas? Or is this just the way things are?

like image 897
Uberfuzzy Avatar asked Sep 28 '09 09:09

Uberfuzzy


1 Answers

Unfortunately, I don't think you can use 'php://memory' as the input and output stream. The workaround is to parse the headers yourself. This can be done pretty easily. Here is an example of a page making two requests and passing the cookies yourself.

curl.php:

<?php  $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, 'http://localhost/test.php?message=Hello!'); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, false); curl_setopt($curl, CURLOPT_HEADER, true);   curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);   $data = curl_exec($curl); curl_close($curl);  preg_match_all('|Set-Cookie: (.*);|U', $data, $matches);    $cookies = implode('; ', $matches[1]);  $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, 'http://localhost/test.php'); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, false); curl_setopt($curl, CURLOPT_HEADER, true);   curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);  curl_setopt($curl, CURLOPT_COOKIE, $cookies);  $data = curl_exec($curl); echo $data;  ?> 

test.php:

<?php session_start(); if(isset($_SESSION['message'])) {     echo $_SESSION['message']; } else {     echo 'No message in session'; }  if(isset($_GET['message'])) {     $_SESSION['message'] = $_GET['message']; } ?> 

This will output 'Hello!' on the second request.

like image 103
James Hall Avatar answered Sep 21 '22 04:09

James Hall