Как установить подключение к розетку в реальном времени между Laravel (PHP) и Python?Php

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Как установить подключение к розетку в реальном времени между Laravel (PHP) и Python?

Сообщение Anonymous »

Я строю систему отслеживания местоположения в режиме реального времени с бэкэнд 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»