Toute façon de garder les cookies de papillotes en mémoire et non sur le disque

StackOverflow https://stackoverflow.com/questions/1486099

  •  18-09-2019
  •  | 
  •  

Question

Je fais un travail cURL en php 5.3.0.

Je me demande s'il y a une façon de dire la poignée / objet boucle pour garder les cookies dans la mémoire (en supposant que je suis en réutilisant la même poignée pour de multiples demandes), ou de les renvoyer en quelque sorte et me les laisser passer en arrière en faisant une nouvelle poignée.

Theres cette méthode depuis longtemps accepté pour les amener dans / de la demande:

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

Mais je suis frappé certains scénarios où je dois être en cours d'exécution de plusieurs copies d'un script sur le même répertoire, et ils marcher sur les autres fichiers de cookies. Oui, je sais que je pourrais utiliser tempnam () et assurez-vous que chaque course a son propre fichier cookie, mais qui me mène à ma 2ème question.

Il y a aussi la question d'avoir ces fichiers de cookies sur le disque du tout. E / S disque est lent et un goulot de bouteille, je suis sûr. Je ne veux pas avoir à faire face à nettoyer le fichier cookie lorsque le script est terminé (si elle sort même d'une manière qui me permet de le nettoyer).

Toutes les idées? Ou est-ce juste les choses sont?

Était-ce utile?

La solution

Vous pouvez utiliser l'option CURLOPT_COOKIEJAR et définir le fichier à "/dev/null" pour Linux / MacOS X ou "NULL" pour de Windows . Cela permettra d'éviter les cookies soient écrites sur le disque, mais il les conserver en mémoire aussi longtemps que vous réutilisez la poignée et ne pas appeler curl_easy_cleanup().

Autres conseils

Malheureusement, je ne pense pas que vous pouvez utiliser « php: // mémoire » comme l'entrée et flux de sortie. La solution consiste à analyser les en-têtes vous-même. Cela peut se faire assez facilement. Voici un exemple d'une page faisant deux demandes et faire passer les biscuits vous.

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'];
}
?>

Affichera «Bonjour! sur la deuxième demande.

Il suffit de définir CURLOPT_COOKIEFILE à un fichier qui n'existe pas, en général une chaîne vide est la meilleure option. Ensuite, ne réglez pas CURLOPT_COOKIEJAR, c'est le truc. Cela permettra d'éviter un fichier en cours d'écriture, mais les témoins restera en mémoire. Je viens de tester cela et il fonctionne (mon test: envoyer des données http auth vers une URL qui vous redirige vers une URL de connexion qui authentifie la demande, alors vous redirige vers l'URL d'origine avec un cookie).

Si vous utilisez Linux, vous pouvez définir ce à point quelque part dans / dev / shm .. cela va les garder en mémoire et vous pouvez être assurés qu'ils ne seront pas conservés dans les redémarrages.

Je pensais en quelque sorte que le nettoyage de Curl a géré la déliaison des cookies, mais je peux me tromper.

Il y a, mais il est tout à fait unintuitive.

curl_setopt($curl, CURLOPT_COOKIEFILE, "");

Pour plus de détails s'il vous plaît voir ma réponse dans les commentaires

Ce qui fonctionne pour moi utilise ce paramètre:

curl_setopt($ch, CURLOPT_HEADER, 1);

Et puis l'analyse du résultat. Détails dans ce billet de blog où j'ai découvert comment faire cela.
Et puisque ce qui est vieux, voici un essentiel de remplacer les fonctions dépréciées .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top