2010-11-13 10 views
17

देता है मुझे इस सवाल से पूछने में हिचकिचाहट है क्योंकि यह अजीब लग रहा है। लेकिन वैसे भी। बस में मामला किसी एक ही समस्या पहले से ही सामना करना पड़ा था ... फाइल सिस्टम कार्य (fopem, फ़ाइल, file_get_contents) http के लिए बहुत ही अजीब व्यवहार करते हैं: // आवरणfile_get_contents खाली स्ट्रिंग

  • यह प्रतीत होता है काम करता है। कोई त्रुटि नहीं। fopen() संसाधन देता है।
  • यह सभी निश्चित रूप से काम करने वाले यूआरएल (उदा। http://google.com/) के लिए कोई डेटा नहीं देता है।
    फ़ाइल रिटर्न खाली सरणी, file_get_contents() रिटर्न रिक्त स्ट्रिंग, fread रिटर्न झूठी
  • सब जानबूझकर गलत यूआरएल के लिए
  • (जैसे http://goog973jd23le.com/) यह बिल्कुल वैसा ही व्यवहार करती है, थोड़ा [माना जाता है कि डोमेन देखने] टाइमआउट को बचाने के लिए, जिसके बाद मुझे पता नहीं मिलता है त्रुटि (जबकि चाहिए!) लेकिन खाली स्ट्रिंग।
  • url_fopen_wrapper पर
  • कर्ल (दोनों आदेश पंक्ति और php संस्करण) ठीक काम करता है बदल गया है, अन्य सभी सुविधाएं और अनुप्रयोगों ठीक, स्थानीय फ़ाइलों ठीक

This error अयोग्य लगता खोला काम करता है क्योंकि मेरे मामले में यह हर यूआरएल या मेजबान के लिए काम नहीं करता है।

php-एफ पी एम 5.2.11 लिनक्स संस्करण 2.6.35.6-48.fc14.i686 ([email protected])

+0

वहाँ किसी भी कारण से भी आपको libcurl का उपयोग नहीं करना चाहते है? ऐसा लगता है कि यह काम कर रहा है यह आपके लिए एक आदर्श प्रतिस्थापन हो सकता है। – Treffynnon

+1

@Treffynnon मैं अभी कोड का उपयोग करने के लिए कोड को फिर से लिख रहा हूं, लेकिन अभी भी जानना चाहता हूं कि file_get_contents() –

+0

के साथ क्या गलत है यह किस विशिष्ट यूआरएल के लिए काम नहीं करता है? – mario

उत्तर

22

मैं PHP विन्यास से --with-curlwrapper निकालकर और पुनर्निर्माण द्वारा अपने सर्वर (फेडोरा 14 पर पीएचपी 5.3.3 चल) पर इस समस्या का समाधान हो।

+1

आज इस बार फिर से बढ़ गया है, इस बार default_socket_timeout 0 पर सेट है (जिसका मतलब असीमित होना चाहिए) इसे तुरंत विफल कर रहा था। –

+0

मेरा दिन बचाया, बहुत मददगार !!! धन्यवाद @ एरिक कैरॉन –

4

जब आप http धारा आवरण पीएचपी का उपयोग एक सरणी बनाता है file_get_contents() (या कार्यों के किसी भी अन्य परिवार के परिवार) के बाद $http_response_header कहा जाता है। इसमें प्रतिक्रिया की स्थिति पर उपयोगी जानकारी है। क्या आप इस सरणी के var_dump() कर सकते हैं और देख सकते हैं कि यह आपको प्रतिक्रिया पर और जानकारी देता है?

यह वास्तव में एक अजीब त्रुटि है जिसे आप प्राप्त कर रहे हैं। एकमात्र चीज जो मैं सोच सकता हूं वह यह है कि सर्वर पर कुछ और PHP से http अनुरोधों को अवरुद्ध कर रहा है, लेकिन फिर मैं नहीं देख सकता कि क्यों curl अभी भी ठीक रहेगा ...

+0

http_header_response पर var_dump एक पूर्ण देता है। –

+0

आपका मतलब $ http_response_header था, है ना? – Jeremy

2

क्या आपकी स्ट्रीम स्थापना में http स्ट्रीम पंजीकृत है ? अपने phpinfo() आउटपुट में "पंजीकृत PHP स्ट्रीम" की तलाश करें। मेरा कहना है "https, ftps, compress.zlib, compress.bzip2, php, file, glob, data, http, ftp, phar, zip"।

यदि कोई http नहीं है, तो पर allow_url_fopen सेट करें।

-1

क्या fsockopen के साथ एक परीक्षण आपको बता करता है?

अन्य कोड से अलग परीक्षण है?

12

एक बग की तरह लगता है। लेकिन अभी भावी पीढ़ी के लिए, यहाँ कुछ चीजें आप डिबग करने के लिए चाहते हो सकता है कर रहे हैं।

  • allow_url_fopen: पहले से ही परीक्षण किया अपाचे के तहत
  • पीएचपी पीएचपी-CLI से अलग तरीके से व्यवहार कर सकता है और chroot/SELinux/FastCGI/आदि में संकेत होगा।सुरक्षा प्रतिबंधों
  • स्थानीय फ़ायरवॉल: संभावना नहीं कर्ल काम करता है के बाद से
  • उपयोगकर्ता-एजेंट अवरुद्ध: यह बहुत आम वास्तव में, वेबसाइटों क्रॉलर्स और अज्ञात ग्राहकों को ब्लॉक है
  • अपने आईएसपी, जो या तो mangles या ब्लॉक (पीएचपी उपयोगकर्ता- से
  • पारदर्शी प्रॉक्सी एजेंट या गैर उपयोगकर्ता-एजेंट

वैसे भी मैलवेयर)

  • पीएचपी धारा आवरण समस्याओं
  • व्याख्या की जा सकती है, पहले आइए सबूत है कि PHPs धारा संचालकों कार्य कर रहे हैं:

    <?php 
        if (!file_get_contents("data:,ok")) { 
          die("Houston, we have a stream wrapper problem."); 
        } 
    

    फिर यह देखने का प्रयास करें कि क्या PHP वास्तविक HTTP अनुरोध करता है या नहीं। कंसोल पर सबसे पहले खुला netcat:

    nc -l 80000 
    

    और डिबग बस के साथ:

    <?php 
        print file_get_contents("http://localhost:8000/hello"); 
    

    और यहाँ से आप PHP के साथ संवाद करने की कोशिश कर सकते हैं, अगर कुछ भी देता है अगर आप प्रतिक्रिया variate देखते हैं। नेटकैट में पहले अमान्य प्रतिक्रिया दर्ज करें। अगर कोई त्रुटि फेंक नहीं है, तो आपका PHP पैकेज बोर्क किया गया है।

    (तुम भी एक से अधिक संवाद स्थापित करने की कोशिश कर सकते "टीसीपी: // .." तो संभाल।)

    आगे http धारा आवरण मानकों के साथ प्रयोग किया जाता है। http://example.com/ का शाब्दिक रूप से उपयोग करें, जो काम करने के लिए जाना जाता है और कभी भी उपयोगकर्ता-एजेंटों को अवरुद्ध नहीं करता है।

    $context = stream_context_create(array("http"=>array(
        "method" => "GET", 
        "header" => "Accept: xml/*, text/*, */*\r\n", 
        "ignore_errors" => false, 
        "timeout" => 50, 
    )); 
    
    print file_get_contents("http://www.example.com/", false, $context, 0, 1000); 
    

    मुझे लगता है कि ignore_errors यहाँ बहुत ही प्रासंगिक है। लेकिन http://www.php.net/manual/en/context.http.php की जाँच और विशेष रूप से स्थापित करने के लिए protocol_version 1.1 करने की कोशिश (chunked और प्रतिक्रिया की गलत व्याख्या की हो जाएगी, लेकिन कम से कम हम अगर कुछ भी रिटर्न देखेंगे)।

    यदि यह भी असफल रहता है, तो http wrapper को हैक करने का प्रयास करें।

    <?php 
        ini_set("user_agent" , "Mozilla/3.0\r\nAccept: */*\r\nX-Padding: Foo"); 
    

    यह न केवल उपयोगकर्ता-एजेंट सेट करेगा, बल्कि अतिरिक्त शीर्षलेख इंजेक्ट करेगा। यदि http स्ट्रीम रैपर के भीतर अनुरोध के साथ एक प्रसंस्करण समस्या है, तो यह अंततः इसे पकड़ सकता है।

    अन्यथा किसी भी ज़ेंड एक्सटेंशन को अक्षम करने का प्रयास करें, सुहोसिन, PHP xdebug, एपीसी और अन्य कोर मॉड्यूल। अंतर हो सकता है। अन्यथा यह फेडोरा पैकेज के लिए विशिष्ट समस्या है। एक नया संस्करण आज़माएं, देखें कि यह आपके सिस्टम पर बनी रहती है या नहीं।

    -1

    मुझे XAMPP 1.7.7 इंस्टॉल करने के बाद विंडोज़ में एक ही समस्या थी। आखिरकार मैं php.ini को निम्न पंक्ति जोड़कर इसे हल करने में कामयाब (जबकि allow_url_fopen = पर होने):

    विस्तार = php_openssl.dll