प्रतिक्रिया के इंतजार किए बिना PHP से HTTP अनुरोध भेजें?




curl server-side (6)

मैं PHP से भेजे गए HTTP GET अनुरोध को चाहता हूं। उदाहरण:

http://tracker.example.com?product_number=5230&price=123.52

विचार सर्वर-साइड वेब-एनालिटिक्स करना है: जावास्क्रिप्ट से सर्वर पर ट्रैकिंग जानकारी भेजने के बजाय, सर्वर ट्रैकिंग जानकारी सीधे किसी अन्य सर्वर पर भेजता है।

आवश्यकताएँ:

  • अनुरोध को PHP पृष्ठ की प्रसंस्करण में देरी से ध्यान देने के लिए जितना संभव हो उतना समय लेना चाहिए।

  • tracker.example.com की प्रतिक्रिया को tracker.example.com आवश्यकता नहीं है। उदाहरण के रूप में, tracker.example.com से कुछ संभावित प्रतिक्रियाएं:

    • 200: यह ठीक है, लेकिन इसे जांचने की कोई ज़रूरत नहीं है।

    • 404: दुर्भाग्य, लेकिन - फिर से - इसे जांचने की कोई ज़रूरत नहीं है।

    • 301: हालांकि एक रीडायरेक्ट उचित होगा, लेकिन यह PHP पृष्ठ की प्रसंस्करण में देरी करेगा, इसलिए ऐसा न करें।

    संक्षेप में: सभी प्रतिक्रियाओं को त्याग दिया जा सकता है।

समाधान के लिए विचार:

  • अब हटाए गए उत्तर में, किसी ने शैल प्रक्रिया में PHP से कॉलिंग कमांड लाइन curl सुझाव दिया है। यह एक अच्छा विचार प्रतीत होता है, केवल इतना है कि मुझे नहीं पता कि भारी भार के तहत कई खोल प्रक्रियाओं को फोर्क करना एक बुद्धिमान बात है।

  • मैंने php-ga पाया, php-ga सर्वर-साइड Google Analytics करने के लिए एक पैकेज। प्रोजेक्ट के पेज पर, इसका उल्लेख है: "कॉन्फ़िगर किया जा सकता है [...] गैर-अवरुद्ध अनुरोधों का उपयोग करें।" अब तक मुझे यह जांचने का समय नहीं मिला है कि कौन सी विधि php-ga आंतरिक रूप से उपयोग करती है, लेकिन यह विधि हो सकती है!

संक्षेप में: PHP से जेनेरिक सर्वर-साइड ट्रैकिंग / एनालिटिक्स करने का सबसे अच्छा समाधान क्या है।


आप shell_exec, और कमांड लाइन कर्ल का उपयोग कर सकते हैं।

उदाहरण के लिए, यह प्रश्न देखें


आप वास्तव में सीधे CURL का उपयोग कर ऐसा कर सकते हैं।

मैंने दोनों इसे बहुत ही कम समय समाप्ति ( CURLOPT_TIMEOUT_MS ) और / या curl_multi_exec का उपयोग करके कार्यान्वित किया है।

सलाह दीजिए: अंत में मैंने इस विधि को छोड़ दिया क्योंकि हर अनुरोध सही ढंग से नहीं किया गया था। यह मेरे अपने सर्वर के कारण हो सकता है हालांकि मैं कर्ल विफल होने के विकल्प को रद्द करने में सक्षम नहीं हूं।


दुर्भाग्य से परिभाषा द्वारा PHP अवरुद्ध है । हालांकि यह अधिकांश कार्यों और संचालन के लिए सच है, जो आप आमतौर पर संभालेंगे, वर्तमान परिदृश्य अलग है।

प्रक्रिया जिसे मैं HTTP-Ping को कॉल करना चाहता हूं, के लिए आवश्यक है कि आप केवल एक विशिष्ट यूआरआई को स्पर्श करें , विशिष्ट सर्वर को इसके आंतरिक तर्क को बूट-स्ट्रैप करने के लिए मजबूर कर दें। कुछ फ़ंक्शंस आपको प्रतिक्रिया के इंतजार के द्वारा इस HTTP-ping के समान कुछ प्राप्त करने की अनुमति देते हैं।

ध्यान दें कि एक यूआरएल पिंग करने की प्रक्रिया, एक दो कदम प्रक्रिया है:

  1. DNS को हल करें
  2. अनुरोध करना

एक बार DNS हल हो जाने के बाद अनुरोध करना और तेज़ होना चाहिए, कनेक्शन बनने के बाद, DNS को तेज़ी से हल करने के कई तरीके नहीं हैं।

Http-ping करने के कुछ तरीके हैं:

  1. कम मूल्य पर CONNECTION_TIMEOUT सेट करके, cURL
  2. लिखने के तुरंत बाद बंद करके fsockopen
  3. stream_socket_client ( stream_socket_client समान) और STREAM_CLIENT_ASYNC_CONNECT जोड़ना

जबकि DNS और हल हो रहा है, जबकि cURL और fsockopen दोनों अवरुद्ध कर रहे हैं। मैंने देखा है कि सबसे खराब स्थिति परिदृश्यों में भी fsockopen काफी तेज है।

दूसरी ओर stream_socket_client को DNS समाधान के संबंध में समस्या को ठीक करना चाहिए और इस परिदृश्य में इष्टतम समाधान होना चाहिए, लेकिन मैंने इसे काम करने में कामयाब नहीं किया है।

एक अंतिम समाधान एक और थ्रेड / प्रक्रिया शुरू करना है जो आपके लिए यह करता है। इसके लिए सिस्टम कॉल करना काम करना चाहिए, लेकिन मौजूदा प्रक्रिया को भी forking करना चाहिए। दुर्भाग्यवश दोनों एप्लिकेशन में वास्तव में सुरक्षित नहीं हैं जहां आप उस वातावरण को नियंत्रित नहीं कर सकते जिस पर PHP चल रहा है।

सिस्टम कॉल अवरुद्ध होने की तुलना में अधिक बार होती है और डिफ़ॉल्ट रूप से पीसीएनटीएल सक्षम नहीं होती है।


मुझे कुछ ऐसा करने की ज़रूरत थी, बस एक यूआरएल पिंग करें और सभी प्रतिक्रियाओं को त्याग दें। मैंने proc_open कमांड का उपयोग किया जो आपको proc_close का उपयोग कर प्रक्रिया को तुरंत समाप्त करने देता है। मुझे लगता है कि आपके सर्वर पर lynx इंस्टॉल है:

<?php    
function ping($url) {
      $proc = proc_open("lynx $url",[],$pipes);
      proc_close($proc);
    }
?>

मैंने प्रतिक्रिया के इंतजार किए बिना यूआरएल के तेज़ जीईटी अनुरोध के लिए फ़ंक्शन लागू किया:

function fast_request($url)
{
    $parts=parse_url($url);
    $fp = fsockopen($parts['host'],isset($parts['port'])?$parts['port']:80,$errno, $errstr, 30);
    $out = "GET ".$parts['path']." HTTP/1.1\r\n";
    $out.= "Host: ".$parts['host']."\r\n";
    $out.= "Content-Length: 0"."\r\n";
    $out.= "Connection: Close\r\n\r\n";

    fwrite($fp, $out);
    fclose($fp);
}

<?php
// Create a stream
$opts = array(
  'http'=>array(
    'method'=>"GET",
    'header'=>"Accept-language: en" 
  )
);

 $context = stream_context_create($opts);

// Open the file using the HTTP headers set above
$file = file_get_contents('http://tracker.example.com?product_number=5230&price=123.52', false, $context);
?>




web-analytics