ठीक है, यह दिखाने के लिए कि वास्तव में PHP में एक पीओपी 3 सर्वर लिखना संभव है, यहां यह है। सर्वर कोई प्रमाणीकरण नहीं करता है - या बहुत कुछ और भी। यह सिर्फ एक ही संदेश भेजना जारी रखता है। लेकिन यह काम करता है। थंडरबर्ड इससे संदेश पुनर्प्राप्त करने में सक्षम था। पूरी तरह से बेकार, लेकिन शांत तरह का।
मेरा सेटअप PHP 5.2 के साथ विंडोज पर अपाचे 2 है।
<?php
// echo something so fopen() would return
header("Content-type: text/plain");
echo "OK\n";
flush();
// listen for incoming connection
$listen_socket = socket_create_listen(110, 1);
$r = $w = $e = array($listen_socket);
$n = socket_select($r, $w, $e, 120);
$client_socket = ($n == 1) ? socket_accept($listen_socket) : null;
socket_close($listen_socket);
// spawn copy of myself
$internal_url = "http://{$_SERVER['HTTP_HOST']}:{$_SERVER['SERVER_PORT']}{$_SERVER['SCRIPT_NAME']}";
$stream_context_options = array (
'http' => array (
'method' => 'GET',
'timeout' => 1
)
);
$context = stream_context_create($stream_context_options);
if($f = fopen($internal_url, "rb", 0, $context)) {
fclose($f);
}
if(!$client_socket) {
// timed out
exit;
}
// start handling the session
$read_buffer = "";
$write_buffer = "+OK POP3 server ready\r\n";
$active = true;
$messages = array(
"From: [email protected]\r\nSubject: This is a test\r\n\r\nHello world!\r\n"
);
$idle_start = time();
while(true) {
$r = $w = $e = array($client_socket);
$n = socket_select($r, $w, $e, 60);
if($n) {
if($r) {
// read from the socket
$read_buffer .= socket_read($client_socket, 128);
$idle_start = time();
}
if($w) {
if($write_buffer) {
// write to the socket
$written = socket_write($client_socket, $write_buffer);
$write_buffer = substr($write_buffer, $written);
$idle_start = time();
} else if($active) {
$now = time();
$idle_time = $now - $idle_start;
if($idle_time > 10) {
// exit if nothing happened for 10 seconds
break;
} else if($idle_time > 2) {
// start napping when the client is too slow
sleep(1);
}
} else {
break;
}
}
if($e) {
break;
}
if($read_buffer) {
if(preg_match('/(.*?)(?:\s+(.*?))?[\r\n]+/', $read_buffer, $matches)) {
$read_buffer = substr($read_buffer, strlen($matches[0]));
$command = $matches[1];
$argument = $matches[2];
switch($command) {
case 'USER':
$username = $argument;
$write_buffer .= "+OK $username is welcome here\r\n";
break;
case 'PASS':
$message_count = count($messages);
$write_buffer .= "+OK mailbox has $message_count message(s)\r\n";
break;
case 'QUIT':
$write_buffer .= "+OK POP3 server signing off\r\n";
$active = false;
break;
case 'STAT':
$message_count = count($messages);
$mailbox_size = 0;
foreach($messages as $message) {
$mailbox_size += strlen($message);
}
$write_buffer .= "+OK $message_count $mailbox_size\r\n";
break;
case 'LIST':
$start_index = (int) $argument;
$message_count = count($messages) - $start_index;
$total_size = 0;
for($i = $start_index; $i < count($messages); $i++) {
$total_size += strlen($messages[$i]);
}
$write_buffer .= "+OK $message_count messages ($total_size octets)\r\n";
for($i = $start_index; $i < count($messages); $i++) {
$message_id = $i + 1;
$message_size = strlen($messages[$i]);
$write_buffer .= "$message_id $message_size\r\n";
}
$write_buffer .= ".\r\n";
break;
case 'RETR':
$message_id = (int) $argument;
$message = $messages[$message_id - 1];
$message_size = strlen($message);
$write_buffer .= "+OK $message_size octets\r\n";
$write_buffer .= "$message\r\n";
$write_buffer .= ".\r\n";
break;
case 'DELE':
$write_buffer .= "+OK\r\n";
break;
case 'NOOP':
$write_buffer .= "+OK\r\n";
break;
case 'LAST':
$message_count = count($messages) - $start_index;
$write_buffer .= "+OK $message_count\r\n";
break;
case 'RSET':
$write_buffer .= "+OK\r\n";
break;
default:
$write_buffer .= "-ERR Unknown command '$command'\r\n";
}
}
}
} else {
break;
}
}
?>
PHP में इसका कार्यान्वयन हो सकता है, लेकिन अगर भगवान के प्यार के लिए इसका उपयोग नहीं किया जाता है! शैल स्क्रिप्ट के अलावा, PHP सबसे खराब भाषा है जो मैं ऐसा करने के बारे में सोच सकता हूं। यदि आप ऐसी भाषा में कुछ चाहते हैं जो वेब डेवलपर समझते हैं, तो नोड.जे.एस. देखें। – DaveRandom
@ डेव रैंडम, आप सही हैं ... हालांकि, मेरा ऐप PHP का उपयोग करता है और मैं विंडोज़ एज़ूर मंच द्वारा प्रदान किए गए विकल्पों से भी सीमित हूं। –
अच्छी तरह से पीओपी 3 और आईएमएपी विशेष रूप से जटिल प्रोटोकॉल नहीं हैं (आप जो समर्थन करना चाहते हैं उसके आधार पर) और PHP में काफी आसानी से कार्यान्वित किया जा सकता है, लेकिन समेकन PHP में एक बड़ी समस्या है क्योंकि यह थ्रेडिंग का समर्थन नहीं करता है और यहां तक कि फोर्किंग की प्रक्रिया भी नहीं है .. गलती ... अच्छा, चलो दयालु रहें और विंडोज़ पर लागू करने के लिए * चुनौतीपूर्ण * कहें। इसके अलावा, दक्षता के अनुसार यह चौंकाने वाला होगा। क्या Node.js इंस्टॉल करने का कोई तरीका नहीं है? Google के चारों ओर घूमते हुए मुझे पहले से ही 2 पीओपी 3 और 1 आईएमएपी सर्वर मिल गया है, जो कि एपीआई का उपयोग करने में आसान है। – DaveRandom