diff --git a/src/danog/MadelineProto/API.php b/src/danog/MadelineProto/API.php index 1689a4a3..47b5ddaf 100644 --- a/src/danog/MadelineProto/API.php +++ b/src/danog/MadelineProto/API.php @@ -123,11 +123,15 @@ class API extends APIFactory public function __set($name, $value) { if ($name === 'settings') { - if (Logger::is_fork()) { + if (Logger::is_fork() && !Logger::$processed_fork) { \danog\MadelineProto\Logger::log('Detected fork'); - $this->API->__wakeup(); + $this->API->reset_session(); + foreach ($this->API->datacenter->sockets as $datacenter) { + $datacenter->close_and_reopen(); + } + Logger::$processed_fork = true; } - + return $this->API->__construct($value); } diff --git a/src/danog/MadelineProto/APIFactory.php b/src/danog/MadelineProto/APIFactory.php index a4651c1d..a19140f7 100644 --- a/src/danog/MadelineProto/APIFactory.php +++ b/src/danog/MadelineProto/APIFactory.php @@ -109,7 +109,6 @@ class APIFactory public $namespace = ''; public $API; public $lua = false; - public $pid; public function __construct($namespace, $API) { @@ -119,12 +118,13 @@ class APIFactory public function __call($name, $arguments) { - if (Logger::is_fork()) { + if (Logger::is_fork() && !Logger::$processed_fork) { \danog\MadelineProto\Logger::log('Detected fork'); $this->API->reset_session(); foreach ($this->API->datacenter->sockets as $datacenter) { $datacenter->close_and_reopen(); } + Logger::$processed_fork = true; } if ($this->API->setdem) { diff --git a/src/danog/MadelineProto/Logger.php b/src/danog/MadelineProto/Logger.php index e6d16819..d46993f9 100644 --- a/src/danog/MadelineProto/Logger.php +++ b/src/danog/MadelineProto/Logger.php @@ -32,6 +32,9 @@ class Logger public static $bigint = true; public static $colors = []; public static $isatty = false; + public static $is_fork = false; + public static $can_getmypid = true; + public static $processed_fork = false; private static $pid; const ULTRA_VERBOSE = 5; @@ -70,14 +73,20 @@ class Logger public static function is_fork() { + if (self::$is_fork) { + return true; + } + if (!self::$can_getmypid) { + return false; + } try { if (self::$pid === null) { self::$pid = getmypid(); } - return self::$pid !== getmypid(); + return self::$is_fork = self::$pid !== getmypid(); } catch (\danog\MadelineProto\Exception $e) { - return false; + return self::$can_getmypid = false; } }