2008-11-20 19 views
11

के साथ कुकीज़ भेजने में सक्षम नहीं है मैं file_get_contents (क्यों नहीं पूछता) के साथ किसी अन्य फ़ाइल से सामग्री प्राप्त करने का प्रयास कर रहा हूं। मेरे पास दो फाइलें हैं: test1.php और test2.php। Test1.php लॉग इन करने वाले उपयोगकर्ता पर एक स्ट्रिंग, आधार देता है।file_get_contents

Test2.php test1.php की सामग्री प्राप्त करने का प्रयास करता है और ब्राउज़र द्वारा निष्पादित किया जा रहा है, इस प्रकार कुकीज़ प्राप्त कर रहा है।

$opts = array('http' => array('header'=> 'Cookie: ' . $_SERVER['HTTP_COOKIE']."\r\n"))`; 

मैं के साथ सामग्री retreiving कर रहा हूँ:

$contents = file_get_contents("http://www.domain.com/test1.php", false, $opts); 

लेकिन अब मैं त्रुटि मिलती है:

Warning: file_get_contents(http://www.domain.com/test1.php) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found

file_get_contents साथ कुकीज़ भेजने के लिए, मैं एक स्ट्रीमिंग का प्रसंग बना

क्या कोई जानता है कि मैं यहां क्या कर रहा हूं?

संपादित करें: उल्लेख करने के लिए भूल गए: stream_context के बिना, पृष्ठ बस लोड हो जाता है। लेकिन कुकीज के साथ मुझे जो जानकारी चाहिए वह मुझे नहीं मिलती है।

+0

FYI- यदि आप A2hosting का उपयोग कर रहे हैं तो आपको फॉपेन पहुंच प्रदान करने का अनुरोध करना होगा (सुरक्षा कारणों से वे डिफ़ॉल्ट रूप से इसे बंद कर दें) –

उत्तर

24

सबसे पहले, यह शायद आपके प्रश्न में केवल एक टाइपो है, लेकिन file_get_contents() के तीसरे तर्कों को आपके स्ट्रीमिंग संदर्भ होने की आवश्यकता है, विकल्पों की सरणी नहीं। मैं कुछ इस तरह के साथ एक त्वरित परीक्षण भाग गया, और सब कुछ उम्मीद

$opts = array('http' => array('header'=> 'Cookie: ' . $_SERVER['HTTP_COOKIE']."\r\n")); 
$context = stream_context_create($opts); 
$contents = file_get_contents('http://example.com/test1.txt', false, $context); 
echo $contents; 

के रूप में सर्वर मशीन पीएचपी से URL प्राप्त करते समय एक 404. कोशिश लौटने से और नहीं पर चल रहा है त्रुटि को इंगित करता काम आपका वर्कस्टेशन/डेस्कटॉप/लैपटॉप। हो सकता है कि आपके वेब सर्वर को साइट तक पहुंचने में परेशानी हो रही हो, आपकी स्थानीय मशीन में कैश की गई प्रतिलिपि हो या कुछ अन्य नेटवर्क खराब हो।

सुनिश्चित करें कि आप जिस कुकी को भेज रहे हैं, उसे चलाने के दौरान आप अपना सटीक अनुरोध दोहराएं (कमांड लाइन कर्ल इसके लिए अच्छा है)। यह पूरी तरह से संभव है कि प्रश्न में पृष्ठ कुकी के बिना ब्राउज़र में ठीक लोड हो सकता है, लेकिन जब आप कुकी भेजते हैं तो साइट वास्तव में 404 लौट रही है।

सुनिश्चित करें कि $ _SERVER ['HTTP_COOKIE'] में कच्ची कुकी है आपको लगता है कि यह करता है।

यदि आप स्क्रीन स्क्रैपिंग कर रहे हैं, फ़ायरफ़ॉक्स डाउनलोड करें और LiveHTTPHeaders एक्सटेंशन की एक प्रति डाउनलोड करें। फ़ायरफ़ॉक्स में जो भी पेज आप चाहते हैं, उस तक पहुंचने के लिए सभी आवश्यक कदम उठाएं। फिर, LiveHTTPHeaders से आउटपुट का उपयोग करके, सटीक उसी अनुरोध की आवश्यकता को पुन: बनाएँ। प्रत्येक शीर्षलेख, केवल कुकीज़ शामिल करें।

अंत में, PHP Curl किसी कारण से मौजूद है। यदि संभव हो तो, (मैं नहीं पूछ रहा हूं!) इसके बजाए इसका इस्तेमाल करें। :)

+0

इस कोड का उपयोग करते समय मुझे "HTML शीर्षलेख विफल" की त्रुटि मिल रही है, इसलिए मुझे आवश्यकता है "session_write_close();" जोड़कर समाधान प्राप्त करने के लिए file_get_contents से पहले। क्या यह सही तरीका है? – KinjalMistry

0

सुनिश्चित करें कि फ़ाइल 1.php सर्वर पर मौजूद है। यह सुनिश्चित करने के लिए इसे अपने ब्राउज़र में खोलने का प्रयास करें!

1

जिज्ञासा से बाहर, क्या आप उस पृष्ठ पर file_get_contents का प्रयास कर रहे हैं जिसमें इसकी कोई जगह है? मुझे याद है कि उस यूआरएल पर एफजीसी का इस्तेमाल करने की कोशिश कर रहा था जिसमें नाम में एक जगह थी और मेरे वेब ब्राउजर ने इसे ठीक से पार्स किया था, एफजीसी नहीं था। मैंने '% 20' के साथ '' को बदलने के लिए str_replace का उपयोग करना समाप्त कर दिया।

मुझे लगता है कि यह अपेक्षाकृत आसान होना चाहिए था कि यह फ़ाइल नाम का केवल आधा रिपोर्ट करेगा। साथ ही, मैंने इन पदों में से किसी एक में देखा है, किसी ने हेडर्स को परिभाषित करते समय \ r \ n का उपयोग किया था। ध्यान रखें कि PHP इन्हें सिंगल कोट्स में पसंद नहीं करता है, लेकिन वे डबल में ठीक काम करते हैं।

8

बस इस जानकारी को साझा करने के लिए। session_start() का उपयोग करते समय, सत्र फ़ाइल PHP द्वारा लॉक है। इस प्रकार वास्तविक स्क्रिप्ट एकमात्र स्क्रिप्ट है जो सत्र फ़ाइल तक पहुंच सकती है। यदि आप fsockopen() या file_get_contents() के माध्यम से इसे एक्सेस करने का प्रयास करते हैं तो आप लॉक होने वाली फ़ाइल खोलने का प्रयास करने के बाद से लंबे समय तक प्रतीक्षा कर सकते हैं।

इस समस्या को हल करने का एक तरीका session_write_close() का उपयोग फ़ाइल को अनलॉक करने और session_start() के साथ इसे फिर से करने के लिए करना है।

उदाहरण:

<?php 
$opts = array('http' => array('header'=> 'Cookie: ' . $_SERVER['HTTP_COOKIE']."\r\n")); 
$context = stream_context_create($opts); 
session_write_close(); // unlock the file 
$contents = file_get_contents('http://120.0.0.1/controler.php?c=test_session', false, $context); 
session_start(); // Lock the file 
echo $contents; 
?> 

file_get_contents() के बाद से एक अवरुद्ध समारोह है, दोनों स्क्रिप्ट सत्र फ़ाइल को संशोधित करने की कोशिश में संगामिति में नहीं होगा।

लेकिन मुझे यकीन है कि विस्तारित कनेक्शन के साथ सत्र में हेरफेर करने का यह सबसे अच्छा तरीका नहीं है।

Btw: यह तेजी से cURL और fsockopen()

आप कुछ बेहतर लगता है मुझे पता है चलो है।

+3

इसे पोस्ट करने के लिए बहुत बहुत धन्यवाद :) काश मैं अधिक उत्साह दे सकता हूं क्योंकि आपने मुझे अपने सभी बालों को खींचने से बचाया है। –

+1

धन्यवाद, मेरे लिए साझा करना एक खुशी है;) – Kursion

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