19
This commit is contained in:
@@ -4,13 +4,6 @@
|
||||
* =====================
|
||||
* WebSocket Server للركاب — بورت 3030
|
||||
* Internal HTTP Server — بورت 3031
|
||||
*
|
||||
* الإصلاحات عن النسخة السابقة:
|
||||
* 1. إصلاح بنية الـ closures:
|
||||
* كان update_driver_location خارج الـ onMessage callback → لا يُنفَّذ أبداً
|
||||
* 2. تحليل الـ payload بشكل صحيح (json_decode للـ nested objects)
|
||||
* 3. Heartbeat يُعاد تشغيله تلقائياً عند إعادة الاتصال
|
||||
* 4. تنظيف البنية العامة
|
||||
*/
|
||||
|
||||
use Workerman\Worker;
|
||||
@@ -18,10 +11,32 @@ use PHPSocketIO\SocketIO;
|
||||
|
||||
require_once __DIR__ . '/vendor/autoload.php';
|
||||
|
||||
// ---------------------------------------------------------
|
||||
// نظام تسجيل الأحداث (Logging System)
|
||||
// ---------------------------------------------------------
|
||||
$LOG_FILE = __DIR__ . '/socket_debug.log';
|
||||
|
||||
function socket_log($message, $data = null) {
|
||||
global $LOG_FILE;
|
||||
$date = date('Y-m-d H:i:s');
|
||||
$logMsg = "[$date] $message";
|
||||
if ($data !== null) {
|
||||
$logMsg .= " | DATA: " . (is_string($data) ? $data : json_encode($data, JSON_UNESCAPED_UNICODE));
|
||||
}
|
||||
$logMsg .= PHP_EOL;
|
||||
|
||||
echo $logMsg; // للطباعة في الكونسول إذا كان يعمل في الـ Foreground
|
||||
@file_put_contents($LOG_FILE, $logMsg, FILE_APPEND); // الكتابة في الملف
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------
|
||||
|
||||
socket_log("=== STARTING PASSENGER SOCKET SERVER ===");
|
||||
|
||||
$INTERNAL_KEY = trim((string) @file_get_contents('/home/intaleq-rides/.internal_socket_key'));
|
||||
|
||||
if (empty($INTERNAL_KEY)) {
|
||||
echo '[CRITICAL] Internal key missing! Exiting.' . PHP_EOL;
|
||||
socket_log("[CRITICAL_ERROR] Internal key missing! Exiting.");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
@@ -37,7 +52,10 @@ $io->on('workerStart', function () use ($io, $INTERNAL_KEY, $INTERNAL_PORT) {
|
||||
$innerHttp->onMessage = function ($connection, $request) use ($io, $INTERNAL_KEY) {
|
||||
|
||||
$headers = $request->header();
|
||||
$clientIp = $connection->getRemoteIp();
|
||||
|
||||
if (($headers['x-internal-key'] ?? '') !== $INTERNAL_KEY) {
|
||||
socket_log("[HTTP_ERROR] Unauthorized internal request from IP: $clientIp");
|
||||
$connection->send('Unauthorized');
|
||||
return;
|
||||
}
|
||||
@@ -51,6 +69,7 @@ $io->on('workerStart', function () use ($io, $INTERNAL_KEY, $INTERNAL_PORT) {
|
||||
$rawPayload = $post['payload'] ?? null;
|
||||
|
||||
if (!$passengerId || !$rawPayload) {
|
||||
socket_log("[HTTP_ERROR] Missing passenger_id or payload for action: update_ride_status", $post);
|
||||
$connection->send('Error: Missing passenger_id or payload');
|
||||
return;
|
||||
}
|
||||
@@ -59,10 +78,10 @@ $io->on('workerStart', function () use ($io, $INTERNAL_KEY, $INTERNAL_PORT) {
|
||||
? (json_decode($rawPayload, true) ?? $rawPayload)
|
||||
: $rawPayload;
|
||||
|
||||
socket_log("[HTTP_SUCCESS] Emitting 'ride_status_change' to Passenger #$passengerId", $payload);
|
||||
$io->to('passenger_' . $passengerId)->emit('ride_status_change', $payload);
|
||||
|
||||
$connection->send('OK');
|
||||
echo '[' . date('H:i:s') . '] Status update sent to Passenger #' . $passengerId . PHP_EOL;
|
||||
|
||||
} elseif ($action === 'update_driver_location') {
|
||||
|
||||
@@ -70,6 +89,7 @@ $io->on('workerStart', function () use ($io, $INTERNAL_KEY, $INTERNAL_PORT) {
|
||||
$rawPayload = $post['payload'] ?? null;
|
||||
|
||||
if (!$passengerId || !$rawPayload) {
|
||||
socket_log("[HTTP_ERROR] Missing passenger_id or payload for action: update_driver_location", $post);
|
||||
$connection->send('Error: Missing passenger_id or payload');
|
||||
return;
|
||||
}
|
||||
@@ -78,38 +98,43 @@ $io->on('workerStart', function () use ($io, $INTERNAL_KEY, $INTERNAL_PORT) {
|
||||
? (json_decode($rawPayload, true) ?? $rawPayload)
|
||||
: $rawPayload;
|
||||
|
||||
socket_log("[HTTP_SUCCESS] Emitting 'driver_location_update' to Passenger #$passengerId", $payload);
|
||||
$io->to('passenger_' . $passengerId)->emit('driver_location_update', $payload);
|
||||
|
||||
$connection->send('OK');
|
||||
|
||||
} else {
|
||||
socket_log("[HTTP_WARNING] Unknown action received: $action", $post);
|
||||
$connection->send('Unknown action: ' . $action);
|
||||
}
|
||||
};
|
||||
|
||||
$innerHttp->listen();
|
||||
echo '[' . date('H:i:s') . "] Internal HTTP started on port $INTERNAL_PORT" . PHP_EOL;
|
||||
socket_log("[INFO] Internal HTTP started on port $INTERNAL_PORT");
|
||||
});
|
||||
|
||||
$io->on('connection', function ($socket) {
|
||||
|
||||
$query = $socket->handshake['query'] ?? [];
|
||||
$passengerId = $query['id'] ?? null;
|
||||
$clientIp = $socket->conn->remoteAddress ?? 'Unknown';
|
||||
|
||||
if (!$passengerId) {
|
||||
socket_log("[SOCKET_REJECTED] Connection rejected (No passenger ID) from IP: $clientIp");
|
||||
$socket->disconnect();
|
||||
return;
|
||||
}
|
||||
|
||||
$socket->join('passenger_' . $passengerId);
|
||||
echo '[' . date('H:i:s') . "] Passenger Connected: #$passengerId" . PHP_EOL;
|
||||
socket_log("[SOCKET_CONNECTED] Passenger Connected: #$passengerId (IP: $clientIp)");
|
||||
|
||||
$socket->on('heartbeat', function ($data) {
|
||||
// استقبال النبضة فقط — لا يحتاج رد
|
||||
// يمكن تفعيل السطر التالي للتأكد من النبضات إذا أردت دقة شديدة، لكنه قد يملأ ملف الـ log
|
||||
// socket_log("[SOCKET_HEARTBEAT] Received from Passenger #$passengerId");
|
||||
});
|
||||
|
||||
$socket->on('disconnect', function () use ($passengerId) {
|
||||
echo '[' . date('H:i:s') . "] Passenger Disconnected: #$passengerId" . PHP_EOL;
|
||||
$socket->on('disconnect', function () use ($passengerId, $clientIp) {
|
||||
socket_log("[SOCKET_DISCONNECTED] Passenger Disconnected: #$passengerId (IP: $clientIp)");
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user