Anonymous
Как установить подключение к розетку в реальном времени между Laravel (PHP) и Python?
Сообщение
Anonymous » 24 сен 2025, 09:00
Я строю систему отслеживания местоположения в режиме реального времени с бэкэнд Laravel и Flutter Frontend. Я использую Cpanal. < /p>
Итак, как мне подключить это? Я подхожу к этому правильно или нет? Кроме того, за пределами кодов WebSockets не поддерживает PHP 8.2.29 с Laravel 11.45.2.
Код: Выделить всё
# real_time_location_tracking.py - Complete Flask-SocketIO Application for cPanel
import sys
import os
import logging
from datetime import datetime
# Add the project directory to Python path
sys.path.insert(0, os.path.dirname(__file__))
# Configure logging for cPanel
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s %(levelname)s: %(message)s',
handlers=[
logging.FileHandler('real_time_location_tracking.log'),
logging.StreamHandler(sys.stdout)
]
)
logger = logging.getLogger(__name__)
# Import eventlet and monkey patch BEFORE importing Flask
import eventlet
eventlet.monkey_patch()
from flask import Flask, request, jsonify
from flask_socketio import SocketIO, emit, join_room
import requests
import time
# ------------------------------
# Flask app setup
# ------------------------------
app = Flask(__name__)
# app.config['SECRET_KEY'] = 'real-time-location-tracking-secret-key-2024'
# Configure SocketIO for cPanel/Passenger
socketio = SocketIO(
app,
cors_allowed_origins="*",
transports=["polling"], # Force polling only for cPanel
async_mode="eventlet",
allow_upgrades=False, # Disable upgrades for stability
ping_timeout=60,
ping_interval=25,
max_http_buffer_size=1_000_000,
compression=False, # Disable compression to avoid issues
engineio_logger=False, # Disable to reduce log spam
logger=False
)
# Laravel API endpoint
LARAVEL_API = "https://io.fixhr.app/api/location/update"
# In-memory store for locations
live_locations = {}
# Requests session with proper headers
session = requests.Session()
session.headers.update({
"Content-Type": "application/json",
"Accept": "application/json",
"User-Agent": "RealTimeLocationTracker/1.0"
})
# ------------------------------
# Socket.IO Events
# ------------------------------
@socketio.on("connect")
def on_connect(auth):
client_id = request.sid
logger.info(f"✅ Client connected: {client_id}")
# Send confirmation with transport info
emit("connection_confirmed", {
"status": "connected",
"socketId": client_id,
"timestamp": datetime.now().isoformat(),
"transport": "polling",
"server": "RealTimeLocationTracker-cPanel"
})
return True
@socketio.on("disconnect")
def on_disconnect():
client_id = request.sid
logger.info(f"❌ Client disconnected: {client_id}")
@socketio.on("joinTrackingRoom")
def on_join_tracking_room(data):
try:
user_id = data.get('userId', 'default')
room = f"tracking_{user_id}"
join_room(room)
logger.info(f"🏠 User {user_id} joined tracking room: {room}")
emit("joinedTrackingRoom", {
"status": "success",
"room": room,
"socketId": request.sid,
"userId": user_id,
"timestamp": datetime.now().isoformat(),
"transport": "polling"
})
except Exception as e:
logger.error(f"❌ Error joining room: {str(e)}")
emit("error", {"message": "Failed to join tracking room"})
def send_to_laravel_async(data, user_id):
"""Send location to Laravel API asynchronously"""
def _send():
start_time = time.time()
try:
response = session.post(LARAVEL_API, json=data, timeout=10)
elapsed = (time.time() - start_time) * 1000
if response.status_code == 200:
logger.info(f"✅ Location saved for {user_id} ({elapsed:.2f}ms)")
else:
logger.warning(f"⚠️ Laravel API {response.status_code} for {user_id}: {response.text[:200]}")
except requests.exceptions.Timeout:
logger.error(f"❌ Timeout sending location for {user_id}")
except requests.exceptions.ConnectionError:
logger.error(f"❌ Connection error sending location for {user_id}")
except Exception as e:
logger.error(f"❌ Error sending location for {user_id}: {str(e)}")
# Use eventlet spawn for async execution
eventlet.spawn(_send)
def handle_location(data, event_ack, event_broadcast):
"""Process location update"""
try:
user_id = data.get("userId", "unknown")
latitude = data.get("latitude")
longitude = data.get("longitude")
timestamp = data.get("timestamp", datetime.now().isoformat())
# Validate required fields
if not latitude or not longitude:
logger.warning(f"⚠️ Invalid location from {user_id}: lat={latitude}, lng={longitude}")
emit("error", {"message": "Invalid location data - latitude and longitude required"})
return
# Convert to float and validate ranges
try:
lat_float = float(latitude)
lng_float = float(longitude)
if not (-90
мой код файла Flutter < /p>
// enhanced_socket_service.dart - Updated for cPanel compatibility
import 'dart:async';
import 'dart:io';
import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:hrm_employee/utils/fh_constant.dart';
import 'package:hrm_employee/utils/shared_preferences.dart';
import 'package:http/http.dart' as http;
import 'package:socket_io_client/socket_io_client.dart' as IO;
class SocketService {
static IO.Socket? _socket;
static bool _isConnected = false;
static bool _isConnecting = false;
static Timer? _reconnectTimer;
static int _reconnectAttempts = 0;
static const int _maxReconnectAttempts = 20; // Reduced for cPanel
static const Duration _reconnectDelay = Duration(seconds: 5);
static bool _shouldAutoReconnect = true;
// ✅ cPanel optimized URL
static const String _serverUrl = 'https://socket.io.fixhr.app';
// Stream controllers for real-time data
static final StreamController _locationUpdatesController =
StreamController.broadcast();
static final StreamController _connectionStatusController =
StreamController.broadcast();
// Getters for streams
static Stream get locationUpdatesStream => _locationUpdatesController.stream;
static Stream get connectionStatusStream => _connectionStatusController.stream;
static bool get isConnected => _isConnected;
static bool get isConnecting => _isConnecting;
static String? currentUserDeviceId = '';
static Future testServerConnectivity() async {
try {
final response = await http.get(
Uri.parse('$_serverUrl/health'),
headers: {
'Connection': 'keep-alive',
'User-Agent': 'Flutter-Client/1.0',
'Accept': 'application/json',
},
).timeout(const Duration(seconds: 15));
if (response.statusCode == 200) {
return true;
}
return false;
} catch (_) {
return false;
}
}
static Future connect() async {
if (_isConnecting) return;
if (_isConnected) return;
if (!await checkInternetConnection()) return;
bool serverReachable = await testServerConnectivity();
if (!serverReachable) {
_handleConnectionFailure();
return;
}
_isConnecting = true;
_shouldAutoReconnect = true;
await getDevicesId();
await getDeviceIP();
try {
if (_socket != null) {
_socket!.dispose();
_socket = null;
}
_socket = IO.io(
_serverUrl,
IO.OptionBuilder()
.setTransports(['polling'])
.enableReconnection()
.setReconnectionAttempts(5)
.setReconnectionDelayMax(15000)
.setReconnectionDelay(3000)
.enableForceNew()
.setTimeout(20000)
.setPath('/socket.io/')
.setExtraHeaders({
'Connection': 'keep-alive',
'User-Agent': 'Flutter-App/1.0',
'Accept': '*/*',
'Origin': _serverUrl,
'Cache-Control': 'no-cache',
})
.setQuery({
'userId': currentUserDeviceId ?? 'flutter_client',
'transport': 'polling',
'client': 'flutter',
'version': '1.0',
't': DateTime.now().millisecondsSinceEpoch.toString(),
})
.build(),
);
Timer? connectionTimeout = Timer(const Duration(seconds: 20), () {
if (!_isConnected) {
_handleConnectionFailure();
}
});
_socket!.onConnect((_) {
connectionTimeout?.cancel();
_isConnected = true;
_isConnecting = false;
_reconnectAttempts = 0;
_cancelReconnectTimer();
_connectionStatusController
.add({'connected': true, 'socketId': _socket?.id, 'server': 'cPanel-Passenger', 'transport': 'polling'});
_setupEventListeners();
_joinLocationRoom();
});
_socket!.onDisconnect((reason) {
connectionTimeout?.cancel();
_isConnected = false;
_isConnecting = false;
_connectionStatusController.add({'connected': false, 'reason': reason, 'server': 'cPanel-Passenger'});
if (reason != 'io client disconnect' && _shouldAutoReconnect) {
_scheduleReconnect();
}
});
_socket!.onConnectError((_) {
connectionTimeout?.cancel();
_handleConnectionFailure();
});
_socket!.onError((_) {});
_socket!.connect();
} catch (_) {
_handleConnectionFailure();
}
}
static void _setupEventListeners() {
if (_socket == null) return;
_socket!.on('connection_confirmed', (data) {
try {
Map confirmationData = Map.from(data);
} catch (_) {}
});
_socket!.on('locationReceived', (data) {
try {
Map confirmationData = Map.from(data);
_locationUpdatesController.add(confirmationData);
} catch (_) {}
});
_socket!.on('joinedTrackingRoom', (_) {});
_socket!.on('notification', (_) {});
_socket!.on('message', (_) {});
_socket!.on('error', (_) {});
_socket!.on('location_broadcast', (data) {
try {
_locationUpdatesController.add(Map.from(data));
} catch (_) {}
});
}
static void _joinLocationRoom() {
if (_isConnected && _socket != null && currentUserDeviceId != null) {
final roomData = {
'userId': currentUserDeviceId,
'timestamp': DateTime.now().toIso8601String(),
'client': 'flutter',
};
_socket!.emit('joinTrackingRoom', roomData);
}
}
static Map getConnectionInfo() {
return {
'isConnected': _isConnected,
'isConnecting': _isConnecting,
'reconnectAttempts': _reconnectAttempts,
'shouldAutoReconnect': _shouldAutoReconnect,
'serverUrl': _serverUrl,
'socketId': _socket?.id,
'server': 'cPanel-Passenger',
'transport': 'polling',
'userId': currentUserDeviceId,
};
}
static Future getServerStats() async {
try {
final response = await http.get(
Uri.parse('$_serverUrl/api/stats'),
headers: {'Accept': 'application/json'},
).timeout(const Duration(seconds: 10));
if (response.statusCode == 200) {
return Map.from(Map.from(Map.from(response.body as Map)));
}
} catch (_) {}
return {'error': 'Failed to fetch stats'};
}
// Missing methods used in logic
static void _handleConnectionFailure() {
_isConnected = false;
_isConnecting = false;
_scheduleReconnect();
}
static void _scheduleReconnect() {
if (_reconnectAttempts >= _maxReconnectAttempts) return;
_reconnectTimer?.cancel();
_reconnectTimer = Timer(_reconnectDelay, () {
_reconnectAttempts++;
connect();
});
}
static void _cancelReconnectTimer() {
_reconnectTimer?.cancel();
_reconnectTimer = null;
}
}
ошибка
Подключение к серверу Cpanel:
https://socket.io.fixhr.app
i/flutter (11682): │
in incepting socket spence to cpanel ...
.
Проверка здоровья сервера - Статус: 200
i/flutter (11682): │
Ответ сервера: {"active_users": 0, "cpanel_mode": true, "locations_count": 0, "memory_usage": "0 место
Ошибка подключения CPanel: WebSocketExexception: соединение с '
https://socket.io.fixhr.app:0/socket.io ... 351486&eio . Http code: 200
Подробнее здесь:
https://stackoverflow.com/questions/797 ... and-python
1758693609
Anonymous
Я строю систему отслеживания местоположения в режиме реального времени с бэкэнд Laravel и Flutter Frontend. Я использую Cpanal. < /p> Итак, как мне подключить это? Я подхожу к этому правильно или нет? Кроме того, за пределами кодов WebSockets не поддерживает PHP 8.2.29 с Laravel 11.45.2.[code]# real_time_location_tracking.py - Complete Flask-SocketIO Application for cPanel import sys import os import logging from datetime import datetime # Add the project directory to Python path sys.path.insert(0, os.path.dirname(__file__)) # Configure logging for cPanel logging.basicConfig( level=logging.INFO, format='%(asctime)s %(levelname)s: %(message)s', handlers=[ logging.FileHandler('real_time_location_tracking.log'), logging.StreamHandler(sys.stdout) ] ) logger = logging.getLogger(__name__) # Import eventlet and monkey patch BEFORE importing Flask import eventlet eventlet.monkey_patch() from flask import Flask, request, jsonify from flask_socketio import SocketIO, emit, join_room import requests import time # ------------------------------ # Flask app setup # ------------------------------ app = Flask(__name__) # app.config['SECRET_KEY'] = 'real-time-location-tracking-secret-key-2024' # Configure SocketIO for cPanel/Passenger socketio = SocketIO( app, cors_allowed_origins="*", transports=["polling"], # Force polling only for cPanel async_mode="eventlet", allow_upgrades=False, # Disable upgrades for stability ping_timeout=60, ping_interval=25, max_http_buffer_size=1_000_000, compression=False, # Disable compression to avoid issues engineio_logger=False, # Disable to reduce log spam logger=False ) # Laravel API endpoint LARAVEL_API = "https://io.fixhr.app/api/location/update" # In-memory store for locations live_locations = {} # Requests session with proper headers session = requests.Session() session.headers.update({ "Content-Type": "application/json", "Accept": "application/json", "User-Agent": "RealTimeLocationTracker/1.0" }) # ------------------------------ # Socket.IO Events # ------------------------------ @socketio.on("connect") def on_connect(auth): client_id = request.sid logger.info(f"✅ Client connected: {client_id}") # Send confirmation with transport info emit("connection_confirmed", { "status": "connected", "socketId": client_id, "timestamp": datetime.now().isoformat(), "transport": "polling", "server": "RealTimeLocationTracker-cPanel" }) return True @socketio.on("disconnect") def on_disconnect(): client_id = request.sid logger.info(f"❌ Client disconnected: {client_id}") @socketio.on("joinTrackingRoom") def on_join_tracking_room(data): try: user_id = data.get('userId', 'default') room = f"tracking_{user_id}" join_room(room) logger.info(f"🏠 User {user_id} joined tracking room: {room}") emit("joinedTrackingRoom", { "status": "success", "room": room, "socketId": request.sid, "userId": user_id, "timestamp": datetime.now().isoformat(), "transport": "polling" }) except Exception as e: logger.error(f"❌ Error joining room: {str(e)}") emit("error", {"message": "Failed to join tracking room"}) def send_to_laravel_async(data, user_id): """Send location to Laravel API asynchronously""" def _send(): start_time = time.time() try: response = session.post(LARAVEL_API, json=data, timeout=10) elapsed = (time.time() - start_time) * 1000 if response.status_code == 200: logger.info(f"✅ Location saved for {user_id} ({elapsed:.2f}ms)") else: logger.warning(f"⚠️ Laravel API {response.status_code} for {user_id}: {response.text[:200]}") except requests.exceptions.Timeout: logger.error(f"❌ Timeout sending location for {user_id}") except requests.exceptions.ConnectionError: logger.error(f"❌ Connection error sending location for {user_id}") except Exception as e: logger.error(f"❌ Error sending location for {user_id}: {str(e)}") # Use eventlet spawn for async execution eventlet.spawn(_send) def handle_location(data, event_ack, event_broadcast): """Process location update""" try: user_id = data.get("userId", "unknown") latitude = data.get("latitude") longitude = data.get("longitude") timestamp = data.get("timestamp", datetime.now().isoformat()) # Validate required fields if not latitude or not longitude: logger.warning(f"⚠️ Invalid location from {user_id}: lat={latitude}, lng={longitude}") emit("error", {"message": "Invalid location data - latitude and longitude required"}) return # Convert to float and validate ranges try: lat_float = float(latitude) lng_float = float(longitude) if not (-90 мой код файла Flutter < /p> // enhanced_socket_service.dart - Updated for cPanel compatibility import 'dart:async'; import 'dart:io'; import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:hrm_employee/utils/fh_constant.dart'; import 'package:hrm_employee/utils/shared_preferences.dart'; import 'package:http/http.dart' as http; import 'package:socket_io_client/socket_io_client.dart' as IO; class SocketService { static IO.Socket? _socket; static bool _isConnected = false; static bool _isConnecting = false; static Timer? _reconnectTimer; static int _reconnectAttempts = 0; static const int _maxReconnectAttempts = 20; // Reduced for cPanel static const Duration _reconnectDelay = Duration(seconds: 5); static bool _shouldAutoReconnect = true; // ✅ cPanel optimized URL static const String _serverUrl = 'https://socket.io.fixhr.app'; // Stream controllers for real-time data static final StreamController _locationUpdatesController = StreamController.broadcast(); static final StreamController _connectionStatusController = StreamController.broadcast(); // Getters for streams static Stream get locationUpdatesStream => _locationUpdatesController.stream; static Stream get connectionStatusStream => _connectionStatusController.stream; static bool get isConnected => _isConnected; static bool get isConnecting => _isConnecting; static String? currentUserDeviceId = ''; static Future testServerConnectivity() async { try { final response = await http.get( Uri.parse('$_serverUrl/health'), headers: { 'Connection': 'keep-alive', 'User-Agent': 'Flutter-Client/1.0', 'Accept': 'application/json', }, ).timeout(const Duration(seconds: 15)); if (response.statusCode == 200) { return true; } return false; } catch (_) { return false; } } static Future connect() async { if (_isConnecting) return; if (_isConnected) return; if (!await checkInternetConnection()) return; bool serverReachable = await testServerConnectivity(); if (!serverReachable) { _handleConnectionFailure(); return; } _isConnecting = true; _shouldAutoReconnect = true; await getDevicesId(); await getDeviceIP(); try { if (_socket != null) { _socket!.dispose(); _socket = null; } _socket = IO.io( _serverUrl, IO.OptionBuilder() .setTransports(['polling']) .enableReconnection() .setReconnectionAttempts(5) .setReconnectionDelayMax(15000) .setReconnectionDelay(3000) .enableForceNew() .setTimeout(20000) .setPath('/socket.io/') .setExtraHeaders({ 'Connection': 'keep-alive', 'User-Agent': 'Flutter-App/1.0', 'Accept': '*/*', 'Origin': _serverUrl, 'Cache-Control': 'no-cache', }) .setQuery({ 'userId': currentUserDeviceId ?? 'flutter_client', 'transport': 'polling', 'client': 'flutter', 'version': '1.0', 't': DateTime.now().millisecondsSinceEpoch.toString(), }) .build(), ); Timer? connectionTimeout = Timer(const Duration(seconds: 20), () { if (!_isConnected) { _handleConnectionFailure(); } }); _socket!.onConnect((_) { connectionTimeout?.cancel(); _isConnected = true; _isConnecting = false; _reconnectAttempts = 0; _cancelReconnectTimer(); _connectionStatusController .add({'connected': true, 'socketId': _socket?.id, 'server': 'cPanel-Passenger', 'transport': 'polling'}); _setupEventListeners(); _joinLocationRoom(); }); _socket!.onDisconnect((reason) { connectionTimeout?.cancel(); _isConnected = false; _isConnecting = false; _connectionStatusController.add({'connected': false, 'reason': reason, 'server': 'cPanel-Passenger'}); if (reason != 'io client disconnect' && _shouldAutoReconnect) { _scheduleReconnect(); } }); _socket!.onConnectError((_) { connectionTimeout?.cancel(); _handleConnectionFailure(); }); _socket!.onError((_) {}); _socket!.connect(); } catch (_) { _handleConnectionFailure(); } } static void _setupEventListeners() { if (_socket == null) return; _socket!.on('connection_confirmed', (data) { try { Map confirmationData = Map.from(data); } catch (_) {} }); _socket!.on('locationReceived', (data) { try { Map confirmationData = Map.from(data); _locationUpdatesController.add(confirmationData); } catch (_) {} }); _socket!.on('joinedTrackingRoom', (_) {}); _socket!.on('notification', (_) {}); _socket!.on('message', (_) {}); _socket!.on('error', (_) {}); _socket!.on('location_broadcast', (data) { try { _locationUpdatesController.add(Map.from(data)); } catch (_) {} }); } static void _joinLocationRoom() { if (_isConnected && _socket != null && currentUserDeviceId != null) { final roomData = { 'userId': currentUserDeviceId, 'timestamp': DateTime.now().toIso8601String(), 'client': 'flutter', }; _socket!.emit('joinTrackingRoom', roomData); } } static Map getConnectionInfo() { return { 'isConnected': _isConnected, 'isConnecting': _isConnecting, 'reconnectAttempts': _reconnectAttempts, 'shouldAutoReconnect': _shouldAutoReconnect, 'serverUrl': _serverUrl, 'socketId': _socket?.id, 'server': 'cPanel-Passenger', 'transport': 'polling', 'userId': currentUserDeviceId, }; } static Future getServerStats() async { try { final response = await http.get( Uri.parse('$_serverUrl/api/stats'), headers: {'Accept': 'application/json'}, ).timeout(const Duration(seconds: 10)); if (response.statusCode == 200) { return Map.from(Map.from(Map.from(response.body as Map))); } } catch (_) {} return {'error': 'Failed to fetch stats'}; } // Missing methods used in logic static void _handleConnectionFailure() { _isConnected = false; _isConnecting = false; _scheduleReconnect(); } static void _scheduleReconnect() { if (_reconnectAttempts >= _maxReconnectAttempts) return; _reconnectTimer?.cancel(); _reconnectTimer = Timer(_reconnectDelay, () { _reconnectAttempts++; connect(); }); } static void _cancelReconnectTimer() { _reconnectTimer?.cancel(); _reconnectTimer = null; } } [/code] ошибка 💡 🚀 Подключение к серверу Cpanel: https://socket.io.fixhr.app i/flutter (11682): │ 💡 🔗 in incepting socket spence to cpanel ... . 💡 ✅ Проверка здоровья сервера - Статус: 200 i/flutter (11682): │ ✅ ✅ Ответ сервера: {"active_users": 0, "cpanel_mode": true, "locations_count": 0, "memory_usage": "0 место 💥 Ошибка подключения CPanel: WebSocketExexception: соединение с 'https://socket.io.fixhr.app:0/socket.io/?userid=047f92328d9ff9f1&transport=polling&client=flutter&version=1.0&t=1758691351486&eio. Http code: 200 Подробнее здесь: [url]https://stackoverflow.com/questions/79773306/how-to-establish-a-real-time-socket-connection-between-laravel-php-and-python[/url]