2009-09-28 8 views
30

मैं php 5.3.0 में कुछ कर्ल कार्य कर रहा हूं।डिस्क में कर्ल की कुकीज़ रखने के लिए कोई तरीका नहीं है और डिस्क पर नहीं

मुझे आश्चर्य है कि कुकीज़ को स्मृति में रखने के लिए कर्ल हैंडल/ऑब्जेक्ट को बताने का कोई तरीका है (मान लीजिए कि मैं एकाधिक अनुरोधों के लिए एक ही हैंडल का उपयोग कर रहा हूं), या किसी भी तरह उन्हें वापस करने और मुझे उन्हें पास करने दें एक नया संभाल बनाते समय वापस।

थेरेस उन में/रही अनुरोध से बाहर के लिए इस लंबी स्वीकार किए जाते हैं विधि:

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

लेकिन मैं कुछ परिदृश्यों जहां मैं एक ही निर्देशिका से बाहर एक स्क्रिप्ट की कई प्रतियां चल करने की आवश्यकता मार रहा हूँ, और वे एक-दूसरे कुकी फाइलों पर कदम उठाते हैं। हां, मुझे पता है कि मैं tempnam() का उपयोग कर सकता हूं और सुनिश्चित कर सकता हूं कि प्रत्येक रन की अपनी कुकी फ़ाइल हो, लेकिन यह मुझे मेरे दूसरे अंक पर ले जाती है।

डिस्क पर इन कुकी फ़ाइलों को रखने का भी मुद्दा है। डिस्क I/O धीमा है और एक बोतल गर्दन मुझे यकीन है। जब स्क्रिप्ट समाप्त हो जाती है तो मैं कुकी फ़ाइल को साफ करने के साथ सौदा नहीं करना चाहता (अगर यह किसी भी तरह से बाहर निकलता है जो मुझे इसे साफ़ करने देता है)।

कोई विचार? या यह वही तरीका है चीजें हैं?

+7

देखते हैं, मुझे नहीं लगता कि आप आई/ओ डिस्क के बारे में चिंता है जब आप कर रहे हैं नेटवर्क आई/ओ की आवश्यकता होगी है। – NSSec

उत्तर

23

आप विंडोज के लिए लिनक्स/MacOS एक्स या "NULL" के लिए CURLOPT_COOKIEJAR विकल्प का उपयोग कर सकते हैं और फाइल करने के लिए "/dev/null" की स्थापना की। यह कुकीज़ को डिस्क पर लिखे जाने से रोक देगा, लेकिन जब तक आप हैंडल का पुन: उपयोग करते हैं और curl_easy_cleanup() पर कॉल नहीं करते हैं, तब तक यह उन्हें स्मृति में रखेगा।

+0

तो कुकीज़ curl_close() कहा जाता है जब तक वैध होगा? क्या आपने इसका परीक्षण किया है? –

+14

पोस्टिंग से पहले इसे सत्यापित करने के लिए मैंने libcurl स्रोत कोड के माध्यम से पढ़ा। –

+2

मैंने कोशिश की है और यह काम नहीं कर रहा है। न तो विंडोज़ में और न ही * निक्स में। –

2

यदि लिनक्स का उपयोग करते हैं, तो आप इन्हें कहीं भी/dev/shm के भीतर इंगित करने के लिए सेट कर सकते हैं .. यह उन्हें स्मृति में रखेगा और आपको आश्वस्त किया जा सकता है कि वे फिर से बूट में नहीं रहेंगे।

मैंने किसी भी तरह सोचा कि कर्ल की सफाई ने कुकीज को अनलिंक करने के लिए संभाला है, लेकिन मुझे गलत हो सकता है।

+0

क्या आप एक कार्य कार्यान्वयन प्रदान कर सकते हैं? –

25

दुर्भाग्यवश, मुझे नहीं लगता कि आप इनपुट और आउटपुट स्ट्रीम के रूप में 'php: // memory' का उपयोग कर सकते हैं। कामकाज हेडर स्वयं को पार्स करना है। यह बहुत आसानी से किया जा सकता है। यहां एक पृष्ठ का एक उदाहरण दिया गया है जिसमें दो अनुरोध किए गए हैं और स्वयं कुकीज़ को पास कर रहे हैं।

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

हो जाएगा ताकि उत्पादन दूसरे अनुरोध पर।

+2

इस कोड को मुझे काफी मदद मिली धन्यवाद –

+2

नोट यदि आप कुकीज़ बाहर एक बार अनुरोध के एक क्रम में की तुलना में अधिक पार्स, आप अपने स्ट्रिंग में कुकीज़ जमा करने के लिए संभवतः फिर से होने वाली चाबी के लिए नए लोगों के साथ पुराने मूल्यों को अधिलेखित हो सकता है। (.. और एक कुकी जार लागू करने के लिए फिसलन ढलान शुरू होता है!) –

8

बस एक फ़ाइल में CURLOPT_COOKIEFILE सेट करें जो मौजूद नहीं है, आमतौर पर एक खाली स्ट्रिंग सबसे अच्छा विकल्प है। फिर CURLOPT_COOKIEJAR सेट न करें, यह चाल है। यह फ़ाइल को लिखे जाने से रोक देगा लेकिन कुकीज़ मेमोरी में रहेगी। मैंने अभी इसका परीक्षण किया है और यह काम करता है (मेरा परीक्षण: एक यूआरएल पर http auth डेटा भेजें जो आपको लॉगिन यूआरएल पर रीडायरेक्ट करता है जो अनुरोध को प्रमाणित करता है, फिर आपको कुकी के साथ मूल यूआरएल पर रीडायरेक्ट करता है)।

+1

शानदार, यह वही था जो मैं ढूंढ रहा था। मैंने 'CURLOPT_COOKIEFILE' को 'शून्य' पर सेट किया है और' CURLOPT_COOKIEJAR' विकल्प सेट करने से बचना है, और यह काम किया! – silkfire

0

मेरे लिए क्या काम करता है इस सेटिंग को उपयोग कर रहा है:

curl_setopt($ch, CURLOPT_HEADER, 1); 

और फिर परिणाम को पार्स। this blog post में विवरण जहां मुझे पता चला कि यह कैसे करें।
और चूंकि यह पुराना है, यहां gist replacing deprecated functions है।

0

लेकिन यह पूरी तरह से अनजान है।

curl_setopt($curl, CURLOPT_COOKIEFILE, ""); 

अधिक जानकारी के लिए कृपया ईमानदारी से my answer in the comments

संबंधित मुद्दे