خیر socket_listen اجرا میشه و اجرای برنامه به خط بعدی میره. توقف نمیکنه ولی نیازی به loop هم نیست. این دستور کافیه یک بار اجرا بشه.
ولی وقتی به socket_accept برسه منتظر میشه تا یک کلاینت متصل بشه؛ وقتی کلاینت متصل شد میره به خط بعد.
وقتی socket_accept اجرا میشه/کلاینتی متصل میشه، یک سوکت دیگه بوسیله این تابع برگشت داده میشه که بوسیلهء اون با کلاینت ارتباط برقرار میکنیم.
loop رو برای socket_accept استفاده میکنیم که وقتی یک کلاینت قطع شد، دوباره socket_accept اجرا بشه و برنامه پشتش برای اتصال کلاینت بعدی (یا اتصال مجدد همون کلاینت) منتظر بمونه.
البته یک loop هم داریم برای ارتباط دو طرفه با کلاینت. یعنی توی این حلقه پیغام کلاینت رو میخونیم (socket_read)، بعد میتونیم با socket_write پیامی رو در پاسخ بهش بفرستیم، و این فرایند میتونه بطور نامحدود در یک حلقه تکرار بشه. البته معمولا ارتباط نامحدود نیست و بعد از دریافت و ارسال معینی یا با شرط خاصی از حلقه خارج میشه و ارتباط با کلاینت قطع میشه (سوکتی رو که socket_accept برگشت داده بود و ازش برای ارتباط با کلاینت استفاده کرده بودیم با socket_close میبندیم) و بعد میتونیم دوباره در حلقهء خارجی تابع socket_accept رو اجرا کنیم و منتظر اتصال بعدی بمونیم.
بطور مثال این کد رو از منوال کپی کردم و البته کمی دستکاریش کردم تا جمع و جورتر و ساده تر بشه:
<?php
error_reporting(E_ALL);
ini_set('display_errors', '1');
set_time_limit(0);
ignore_user_abort(true);
ob_implicit_flush();
$address='127.0.0.1';
$port = 10000;
if(($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) exit("socket_create() failed!");
if(socket_bind($sock, $address, $port) === false) exit("socket_bind() failed!");
if(socket_listen($sock, 5) === false) exit("socket_listen() failed!");
do {
if(($msgsock = socket_accept($sock)) === false) exit("socket_accept() failed!");
socket_write($msgsock, 'Hi!');
do {
if(false === ($buf = socket_read($msgsock, 2048, PHP_NORMAL_READ))) exit("socket_read() failed!");
if (!$buf = trim($buf)) {
continue;
}
if ($buf == 'quit') break;
if ($buf == 'shutdown') {
socket_close($msgsock);
break 2;
}
$talkback = "PHP: You said '$buf'.\n";
socket_write($msgsock, $talkback);
echo "$buf\n";
} while (true);
socket_close($msgsock);
} while (true);
socket_close($sock);
?>
چیزهایی که گفتم رو توش میتونید ببینید.
این رو در لوکال با مرورگر اجرا کنید مرورگر بطور نامحدود منتظر میمونه و حتی با بستن مرورگر هم متوقف نمیشه.
شما میتونید با telnet در ویندوز بهش وصل بشید.
در خط فرمان تایپ کنید telnet. بعد در خط فرمان telnet که ظاهر میشه تایپ کنید open 127.0.0.1 10000
بعد میبینید که پیام سرور سوکت دریافت میشه که میگه Hi
بعد هرچی شما تایپ کنید و اینتر بزنید، توسط سرور برگشت داده میشه به این شکل: PHP: You said 'test'.
اگر تایپ کنید quit، ارتباط فعلی با کلاینت (telnet) قطع میشه (و میتونید دوباره توسط open 127.0.0.1 10000 بهش وصل بشید).
اگر تایپ کنید shutdown، اجرای برنامهء سرور سوکت بطور کامل متوقف میشه.