Socket Programming in PHP

Creating Socket Connection

Socket Connection Create करने के लिए PHP हमें fsockopen() नाम का एक Function Provide करता है। इस Function का Syntax निम्नानुसार होता हैः

resource fsockopen(string $hostname, int $port = -1, int &$errno, string &$errstr, float $timeout = ini_get(“default_socket_timeout”))

ये Function पांच Parameters Accept करता है। पहला Argument उस Host का Domain Name या IP Address Parameter के रूप में Accept करता है, जिसके Data को हम Current PHP Script द्वारा Access करना चाहते हैं।

यदि OpenSSL Support Installed हो, तो हम इस Parameter में ssl:// या tls:// Protocols को भी Use करके Remote Server से TCP/IP पर SSL या TLS Client Connection को भी Open कर सकते हैं।

दूसरे Parameter के रूप में हमें उस Port Number को Specify करना होता है, जिस पर वह Host अपने Data को Access करने की सुविधा देता है। सामान्यतः Web Pages के लिए हमेंशा Port Number 80 का प्रयोग किया जाता है और ये Port हमेंशा Public Port होता है। यानी इस Port पर हमेंशा HTTP Protocol के माध्यम से Web Pate का Data Available रहता है।

तीसरे Parameter के रूप में हमें एक Variable Specify करना होता है। यदि किसी कारण से ये Function Fail हो जाए और Host से Connection Establish न हो पाए, तो Return होने वाला Error Number इस Variable में Store होता है।

यदि इस Variable में Return होने वाली Value 0 हो व ये Function False Return करे, तो ये इस बात का Indication होता है कि ये Function System Level connect() Call होने से पहले ही Fail हो गया है। ये Error सामान्यतः तब Generate होता है, जब Socket उचित Value से Initialize नहीं होता।

चौथे Parameter के रूप में भी हमें एक Variable Specify करना होता है। यदि किसी कारण से ये Function Fail हो जाए और Host से Connection Establish न हो पाए, तो Return होने वाला Error Message इस Variable में Store होता है।

पांचवे Parameter के रूप में हमें Seconds के रूप में Timeout समय को Specify करना होता है। हम इस Parameter में जो मान Specify करते हैं, हमारा Web Server उतने Seconds तक Remote Server से Connection Establish करने की कोशिश करता है। यदि उतने समय में Connection Establish नहीं होता, तो ये Function Fail हो जाता है।

परिणामस्वरूप तीसरे व चौथे Parameters में Specified Variables में हमें Function के Fail होने की स्थिति में Return होने वाला Error Number व Error Message प्राप्त होता है।

इस Function में केवल पहला Argument ही Compulsory रूप से Specify करना जरूरी होता है। द्रोष सभी Parameters Optional हैं। इसलिए यदि हम अन्य Parameters को Specify नहीं करते हैं, तो ये Function अपने सभी Default Parameters को Use कर लेता है।

यदि ये Function Successfully Run हो जाता है तो ये Function एक File Pointer Return करता है। जिस पर हम विभिन्न File Functions जैसे कि fgets(), fgetss(), fwrite(), fclose()feof() को Use कर सकते हैं व Socket के Data को Access कर सकते हैं।

जबकि यदि ये Function Successfully Run न हो, यानी यदि हम इस Function के पहले Parameter में Valid Hostname Specify न करें, तो ये Function E_WARNING Level का Error Throw करता है।

किसी Remote Server पर Socket Connection Establish करने के लिए हम निम्नानुसार PHP Code को Use कर सकते हैं:

<?php
	// create a socket connection
	$remote = fsockopen('www.google.com', 80, $errno, $errstr, 30);

	if (!$remote) {
		// if no connection, display the error message and number
		echo "$errstr ($errno)";
	}
	else {
		// otherwise communicate with remote server
	}
?>

यदि ये Code Normal तरीके से Run होगा, तो इस Code के if Statement का else Part Run होगा और किसी तरह का कोई Error Generate नहीं होगा, लेकिन यदि Socket Connection Normal तरीके से Establish नहीं हुआ, तो इस PHP Code के if Statement का Execution होगा और Error Number के साथ Error Message Display करेगा।

Sending Request Message to Remote Server over Socket

जब उपरोक्त Code बिना किसी Error के Execute हो जाता है, तो इसका मतलब ये है कि हमारी Script का Connection Remote Server से हो चुका है और हम उस Remote Server पर किसी तरह का Request Message Send कर सकते हैं। इसलिए Socket Connection Establish करने के बाद हमारा अगला काम Request Message Create करना होता है। Request Message Create करने के लिए हम निम्नानुसार Code Create कर सकते हैं:

$out = "GET / HTTP/1.1\r\n";
$out .= "Host: www.twitter.com\r\n";
$out .= "Connection: Close\r\n\r\n";

// send the request
fwrite($remote, $out);

जब हम उपरोक्त Code लिखते हैं, तो सबसे पहले हम GET Method का प्रयोग करते हुए Webhost के Root Page यानी “/” के लिए HTTP/1.1 Protocol के माध्यम से एक Request Create करते हैं।

यानी हम Remote Server से जिस Resource को प्राप्त करना चाहते हैं या जिस Resource को Open करना चाहते हैं, उसे निम्न Format में Specify करते हैं:

GET /path/to/page HTTP/1.1

फिर हमें उस Host को Specify करना होता है, जिस पर हम Request Message Send करना चाहते हैं। इसे हमें निम्नानुसार Format में Specify करना होता हैः

Host: www.twitter.com\r\n“;

अन्तिम Line में हमने Remote Server को उस स्थिति में Connection Close करने का Message दिया है, जब Remote Server हमारी Request पूरी कर देता है। ये काम करने के लिए हमें निम्न Format में Code को Specify करना होता हैः

Connection: Close\r\n\r\n”

Request Message के हर Part को हमें Carriage ReturnNewline Character के Combination से Terminate करना जरूरी होता है। इसीलिए हमने हर Request Message Line के अन्त में “\r\n” Character Combination का प्रयोग किया है। जबकि Request Message की अन्तिम Line में हमने इस Combination को दो बार Use किया है, जो कि Request Message के अन्त को Represent करता है।

एक बार Request Message Create कर लेने के बाद हमें हमारे Created Request Message को उस Remote Server के Socket Connection पर Send करना होता है, जिसे हमने fsockopen() Function द्वारा प्राप्त किया है, ताकि वह Remote Server हमारे Request Message को Accept कर सके और हमें वह Resource Response Message के रूप में Send कर सके, जिसकी Request हमने हमारे Request Message में की है। इसलिए Request को Send करने के लिए हमने fwrite() Function को Use किया है।

जिस तरह से हम fwrite() Function का प्रयोग करके किसी Local File में किसी Data को Write करते हैं, उसी तरह से जब हम किसी Request Message को किसी Socket Connection द्वारा किसी Remote Server पर Send करना चाहते हैं, तो हमें हमारे Request Message को Socket Connection पर Write करना होता है।

क्योंकि किसी Message को Write करना या Send करना एक ही बात है, फिर भले ही वह Message Local Disk File पर Send हो रहा हो या किसी Remote Server के Socket पर Write हो रहा हो।

Receiving Response Message from Remote Server over Socket

जब एक बार Request Message को Socket Connection पर Send कर दिया जाता है, तो Remote Server उस Request Message के आधार पर Response Generate करता है और इस Response को फिर से उसी Socket पर Send कर देता है, जिस पर Request को Send किया गया था।

Response Message को Current PHP Script में Capture करने के लिए हम किसी भी File Reading Function को Use कर सकते हैं, जिन्हें हमने पिछले Section में Local File के Data को Read करने के लिए Use करना सीखा है।

जब हम किसी Remote Server से Socket पर आने वाले Data को Read करना चाहते हैं, तब भी हमें वही सारी प्रक्रियाऐं Use करनी पडती हैं, जो किसी File Reading Function को Use करते समय Follow करनी पडती है।

उदाहरण के लिए यदि हम fgets() Function का प्रयोग करके Socket पर आने वाले Remote Server के Data को Read करना चाहते हैं, तो हमें इस Function में First Parameter के रूप में उस File के Handle को Specify करना होता है, जिसमें Stored Data को हमें Read करना है।

चूंकि हमारा Data एक Remote Server से आ रहा है और एक Socket में आ रहा है, इसलिए ये Socket ही हमें पहले Argument के रूप में Specify करना होता है। fgets() Function को Use करते हुए हम Remote Server के Socket पर आने वाले Data को Read व Access करने के लिए निम्नानुसार PHP Code लिख सकते हैं:

$received = '';
// keep the connection open until the end of the response

while (!feof($remote)) {
	$received .= fgets($remote, 1024);
}

// close the connection
fclose($remote);

इस Code में हम देख सकते हैं हमने fgets() Function को ठीक उसी तरह से Use किया है, जिस तरह से किसी Local File के Data को Read करने के लिए बनाए गए अपने Program में Use किया था।

अन्तर केवल इतना है कि इस बार इस Function के First parameter के रूप में हमने किसी File Handle के स्थान पर एक Socket Connection के Variable को Specify किया है, क्योंकि Remote Server से आने वाला सारा Data इसी $remote नाम के Socket Variable में Stored है।

इस PHP Code में हमने fgets() Function के दूसरे Parameter के रूप में 1024 मान Specify किया है, जो कि Socket से एक बार में Read होने वाले कुल Bytes की संख्‍या है। इस मान को हमें जरूर Specify करना चाहिए, क्योंकि जब हम किसी Remote Server से किसी XML Type की File को Access करते हैं, तो उन Files में Newline जैसी कोई चीज नहीं होती है।

परिणामस्वरूप Remote File के Data को एक निश्चित Byte Chunks के रूप में Read करना ज्यादा उपयुक्त रहता है, अन्यथा File Content Reading से सम्बंधित विभिन्न PHP Function पूरे Resource के Data को एक ही बार में Read करने की कोशिश करते हैं, जिससे Performance प्रभावित होती है।

अन्त में हम Remote Server से Read किए गए Data को Echo या Print जैसे किसी Output Statement का प्रयोग करके Output में Display कर सकते हैं

यदि हम उपरोक्त सभी PHP Codes को एक साथ एक File के रूप में लिखें, तो हमारा Socket Related PHP Program निम्नानुसार होगाः

//Filename: fsockopen.php
<?php
	// Creating a socket connection
	$remote = fsockopen('www.twitter.com', 80, $errno, $errstr, 30);
	if (!$remote) {
		// If no connection, display the error message and number
		echo "$errstr ($errno)";
	}
	else {

	// Request Message
	$out = "GET / HTTP/1.1\r\n";
	$out .= "Host: www.twitter.com\r\n";
	$out .= "Connection: Close\r\n\r\n";
	
	// Send the request
	fwrite($remote, $out);

	$received = '';
	
	// Keeping the connection open until the end of the response.
	while (!feof($remote)) {
		$received .= fgets($remote, 1024);
	}
	
	// close the connection
	fclose($remote);
	
	echo $received;
	}
?>

//Output
HTTP/1.1 301 Moved Permanently
Date: Fri, 01 Jun 2012 06:07:11 GMT
Location: http://twitter.com/
Cache-Control: max-age=300
Expires: Fri, 01 Jun 2012 06:12:11 GMT
Vary: Accept-Encoding
Content-Length: 227
Content-Type: text/html; charset=iso-8859-1
Server: tfe

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="http://twitter.com/">here</a>.</p>
</body></html>

हालांकि ये Output एक Error Message है, जो इस बात को Indicate कर रहा है कि Domain www.twitter.com को Permanently twitter.com पर Move कर दिया गया है। लेकिन यदि हम हमारे इस PHP Code में www.twitter.com को twitter.com से Replace कर दें, तो Twitter Web Site के Home Page का पूरा Code हमें Output के रूप में प्राप्त होता है।

यदि हम उपरोक्त Code को किसी .php File में लिखें और File को Run करें, तो हमें हमारा Output निम्नानुसार प्राप्त होगाः

Socket Programming in PHP - Hindi

जब हम fsockopen() Function का प्रयोग करके किसी Remote Data Source को Access करते हैं, तो हमें प्राप्त होने वाले Data में सभी HTTP Headers Included रहते हैं। साथ ही Source Code के Bottom में कुछ Unwanted Characters भी प्राप्त होते हैं

PHP in Hindiये Article इस वेबसाईट पर Selling हेतु उपलब्‍ध EBook PHP in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी। 

PHP in Hindi | Page: 647 | Format: PDF

BUY NOW GET DEMO REVIEWS