2016-01-05 6 views
16

में एक HTTP/2 पोस्ट अनुरोध भेजते हैं मैं Sending HTTP/2 POST request in Ruby में एक समान प्रश्न पाया लेकिन मैं पीएचपीमैं PHP

नए एप्पल पुश अधिसूचना HTTP/2 आधारित यहाँ वर्णित एपीआई के साथ अपने सर्वर को अपडेट करना चाहते: https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/APNsProviderAPI.html

HTTP/2 अनुभव वाला कोई भी व्यक्ति PHP में क्लाइंट के रूप में अनुरोध करने में मेरी सहायता करता है।

उत्तर

12

PHP> = 5.5.24 के लिए कर्ल एक्सटेंशन HTTP/2 के लिए समर्थन है। (this commit)

आपको एक libcurl स्थापित करने की भी आवश्यकता है - अंतर्निहित लाइब्रेरी जो कर्ल फ़ंक्शन का उपयोग करती है - HTTP/2 समर्थन सक्षम के साथ। इसका मतलब है कि एक libcurl 7.38.0 से नया है लेकिन वास्तव में, बेहतर बेहतर है। संकलन समय पर --with-nghttp2 ध्वज का उपयोग करके, Libcurl को HTTP/2 समर्थन स्पष्ट रूप से सक्षम किया गया है।

बस सामान्य रूप से इसका उपयोग करने के लिए कर्ल का उपयोग करें, और में गुजरकर HTTP/2 का उपयोग करने के लिए CURLOPT_HTTP_VERSION विकल्प सेट करें। तो आपको क्लाइंट और सर्वर दोनों इसका समर्थन करने पर अनुरोध को संस्करण 2 में अपग्रेड कर दिया जाएगा।

PHP 5.5.24 से पहले, यदि libcurl HTTP/2 समर्थन के साथ बनाया गया है, तो आप स्पष्ट रूप से CURL_HTTP_VERSION_2_0 के int मान में पास कर सकते हैं क्योंकि PHP अभी भी libcurl के माध्यम से इसे पास कर देगा। वर्तमान में, इसका मूल्य है - यह नहीं बदला जाना चाहिए, लेकिन हो सकता है।

if (!defined('CURL_HTTP_VERSION_2_0')) { 
    define('CURL_HTTP_VERSION_2_0', 3); 
} 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0); 
+0

मैंने मैक और लिनक्स दोनों पर XAMPP के 5.6.21 और 7.0.6 दोनों संस्करणों को स्थापित करने का प्रयास किया, लेकिन मुझे हमेशा यह त्रुटि मिल रही है: 'HTTP/2 क्लाइंट प्रस्तावना स्ट्रिंग लापता या भ्रष्ट। प्राप्त बाइट्स के लिए हेक्स डंप ... '। क्या आप जानते हैं कि मैं इसे कैसे हल कर सकता हूं? मैं कमांड लाइन से पुश अधिसूचनाएं भेजने में सक्षम हूं, लेकिन PHP में यह काम नहीं करता है। – Nickkk

+0

मैं समझना चाहूंगा कि HTTP/2 और curl 7.38.0 के साथ पुश नोटिफिकेशन साझा होस्टिंग वातावरण में काम करेगा या नहीं? सुरक्षा साझा कारणों से पहले साझा होस्टिंग प्रदाता पोर्ट 2195 और 21 9 6 ब्लॉक करेंगे इसलिए टीसीपी सॉकेट का उपयोग करके अधिसूचना पुश संभव नहीं होगा। –

+0

@raj: यह एक बिल्कुल अलग प्रश्न है, उत्तर के लिए टिप्पणी के लिए उपयुक्त नहीं है ... –

1

वर्तमान समय में PHP में कोई प्रत्यक्ष HTTP/2 समर्थन नहीं है।

वहाँ एक विचार पीएचपी करने के लिए भविष्य प्रत्यक्ष में इस तरह के एक समर्थन जोड़ने के लिए है: https://wiki.php.net/ideas/php6#http2_support

3 पार्टी पुस्तकालय Guzzle https://github.com/guzzle/guzzle HTTP/2 का समर्थन करता है, सही php और कर्ल संस्करण स्थापित कर रहे हैं:

use GuzzleHttp\Client; 

$client = new Client(); 
$client->get('https://http2.akamai.com/demo/tile-0.png', [ 
    'version' => 2.0, 
    'debug' => true, 
]); 
+3

क्या यह काम प्रगति पर नहीं है? https://github.com/guzzle/guzzle/issues/1249 – fntlnz

6

होने पीएचपी> = 5.5.24 भले ही CURL_HTTP_VERSION_2_0 परिभाषित किया गया है कर्ल के साथ एक HTTP/2 अनुरोध करने के लिए पर्याप्त नहीं है,। यदि आप APNS (एप्पल पुश अधिसूचना सेवा) के लिए एक अनुरोध बनाने की कोशिश करते समय निम्न की तरह एक त्रुटि संदेश प्राप्त होगा:

[email protected]@?HTTP/2 client preface string missing or corrupt. Hex dump for received bytes: 504f5354202f332f6465766963652f616538666562613534 

कर्ल के बाद से libcurl के लिए एक binding है, आप भी साथ http/2 सक्षम कर्ल होना आवश्यक है ।

एक नमूना कोड के लिए, मेरे answer एक समान प्रश्न अतः

पर यहाँ करने के लिए प्रक्रिया स्थापित करते हैं, तो आप इस tutorial

+1

धन्यवाद! यह काम किया। हालांकि मैंने 'CURLINFO_HEADER_OUT' का उपयोग कर अनुरोध शीर्षलेखों की जांच की है और यह 'HTTP/1.1' दिखाता है। लेकिन अब यह काम कर रहा है, जहां यह पहले काम नहीं कर रहा था। – andho

+0

मेरे पास PHP 5.6 है, curl 7.54 (HTTP2 समर्थन के साथ) और ओपनएसएसएल 1.0.1 अभी तक 'CURL_HTTP_VERSION_2_0' अभी भी अपरिभाषित है, कोई विचार क्यों? ऐप्पल कनेक्ट करने का प्रयास करते समय एक 'अप्रत्याशित HTTP/1.x अनुरोध' त्रुटि संदेश देता है। – andreszs

+1

@Andrew जांचें कि आपका कर्ल OpenSSL संस्करण 1.0.1 से ऊपर है। आखिर में पता चला कि ऐप्पल एपीएन को टीएलएस के कभी भी संस्करण की आवश्यकता नहीं है, मैं अंततः अपने PHP संस्करण को फिर से तैयार कर रहा हूं। – Larcho

0

चेक बाहर Apache और CLI पीएचपी डोकर छवियों मैं इस उद्देश्य के लिए बनाया का पालन कर सकते हैं जो आधिकारिक PHP 5.6 डॉकर लाइब्रेरी में HTTP/2 समर्थन जोड़ता है। यह किसी भी HTTP/2 client preface string missing or corrupt त्रुटियों से छुटकारा पाता है।

एक बार आपके पास सही वातावरण है, तो PHP के लिए कई जेडब्ल्यूएस/जेडब्ल्यूटी पुस्तकालयों की कोशिश करने के बाद मुझे केवल Spomky-Labs/jose एपीएन के साथ पूरी तरह से काम करने के लिए मिला।