mirror of
https://github.com/danog/MadelineProto.git
synced 2025-01-23 00:11:20 +01:00
Test fibers before first login
This commit is contained in:
parent
d3030f7f8a
commit
26aa11ab2c
12
src/API.php
12
src/API.php
@ -154,6 +154,18 @@ final class API extends AbstractAPI
|
|||||||
return; // OK
|
return; // OK
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$result = Tools::testFibers(100);
|
||||||
|
|
||||||
|
if ($result['maxFibers'] < 100) {
|
||||||
|
$message = "The maximum number of startable fibers is smaller than 100 ({$result['maxFibers']}): follow the instructions in https://t.me/MadelineProto/596 to fix.";
|
||||||
|
if (PHP_SAPI !== 'cli' && PHP_SAPI !== 'phpdbg') {
|
||||||
|
echo $message.'<br>';
|
||||||
|
}
|
||||||
|
$file = 'MadelineProto';
|
||||||
|
$line = 1;
|
||||||
|
return new Exception($message, 0, null, $file, $line);
|
||||||
|
}
|
||||||
|
|
||||||
if (!$settings instanceof Settings) {
|
if (!$settings instanceof Settings) {
|
||||||
$newSettings = new Settings;
|
$newSettings = new Settings;
|
||||||
$newSettings->merge($settings);
|
$newSettings->merge($settings);
|
||||||
|
@ -792,6 +792,23 @@ abstract class InternalDoc
|
|||||||
{
|
{
|
||||||
return $this->wrapper->getAPI()->{__FUNCTION__}();
|
return $this->wrapper->getAPI()->{__FUNCTION__}();
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* Get current number of memory-mapped regions, UNIX only.
|
||||||
|
* @return ?int
|
||||||
|
*/
|
||||||
|
public static function getMaps(): ?int
|
||||||
|
{
|
||||||
|
return \danog\MadelineProto\Tools::getMaps();
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Get maximum number of memory-mapped regions, UNIX only.
|
||||||
|
* Use testFibers to get the maximum number of fibers on any platform.
|
||||||
|
* @return ?int
|
||||||
|
*/
|
||||||
|
public static function getMaxMaps(): ?int
|
||||||
|
{
|
||||||
|
return \danog\MadelineProto\Tools::getMaxMaps();
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* Get TL namespaces.
|
* Get TL namespaces.
|
||||||
*/
|
*/
|
||||||
@ -1458,6 +1475,15 @@ abstract class InternalDoc
|
|||||||
{
|
{
|
||||||
return $this->wrapper->getAPI()->{__FUNCTION__}($params, $key);
|
return $this->wrapper->getAPI()->{__FUNCTION__}($params, $key);
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* Test fibers.
|
||||||
|
*
|
||||||
|
* @return array{maxFibers: int, realMemoryMb: int, maps: ?int, maxMaps: ?int}
|
||||||
|
*/
|
||||||
|
public static function testFibers(int $fiberCount = 100000): array
|
||||||
|
{
|
||||||
|
return \danog\MadelineProto\Tools::testFibers($fiberCount);
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* Create an artificial timeout for any Generator or Promise.
|
* Create an artificial timeout for any Generator or Promise.
|
||||||
*
|
*
|
||||||
|
@ -987,7 +987,7 @@ trait Files
|
|||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
} catch (RPCErrorException $e) {
|
} catch (RPCErrorException $e) {
|
||||||
if (\strpos($e->rpc, 'FLOOD_WAIT_') === 0) {
|
if (\strpos($e->rpc, 'FLOOD_WAIT_') === 0 || $e->rpc === '-503') {
|
||||||
Tools::sleep(1);
|
Tools::sleep(1);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -43,14 +43,16 @@ use function unpack;
|
|||||||
abstract class Tools extends AsyncTools
|
abstract class Tools extends AsyncTools
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* @internal Test fibers
|
* Test fibers.
|
||||||
|
*
|
||||||
|
* @return array{maxFibers: int, realMemoryMb: int, maps: ?int, maxMaps: ?int}
|
||||||
*/
|
*/
|
||||||
public static function testFibers(): ?array
|
public static function testFibers(int $fiberCount = 100000): array
|
||||||
{
|
{
|
||||||
\ini_set('memory_limit', -1);
|
\ini_set('memory_limit', -1);
|
||||||
|
|
||||||
$f = [];
|
$f = [];
|
||||||
for ($x = 0; $x < 100000; $x++) {
|
for ($x = 0; $x < $fiberCount; $x++) {
|
||||||
try {
|
try {
|
||||||
$f []= $cur = new Fiber(function (): void {
|
$f []= $cur = new Fiber(function (): void {
|
||||||
Fiber::suspend();
|
Fiber::suspend();
|
||||||
@ -63,10 +65,40 @@ abstract class Tools extends AsyncTools
|
|||||||
return [
|
return [
|
||||||
'maxFibers' => $x,
|
'maxFibers' => $x,
|
||||||
'realMemoryMb' => (int) (\memory_get_usage(true)/1024/1024),
|
'realMemoryMb' => (int) (\memory_get_usage(true)/1024/1024),
|
||||||
'maps' => \substr_count(@\file_get_contents('/proc/self/maps'), "\n")-1,
|
'maps' => self::getMaps(),
|
||||||
'maxMaps' => (int) @\file_get_contents('/proc/sys/vm/max_map_count'),
|
'maxMaps' => self::getMaxMaps(),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* Get current number of memory-mapped regions, UNIX only.
|
||||||
|
*/
|
||||||
|
public static function getMaps(): ?int
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
if (\file_exists('/proc/self/maps')) {
|
||||||
|
return \substr_count(@\file_get_contents('/proc/self/maps'), "\n")-1;
|
||||||
|
}
|
||||||
|
$pid = \getmypid();
|
||||||
|
if (\file_exists("/proc/$pid/maps")) {
|
||||||
|
return \substr_count(@\file_get_contents("/proc/$pid/maps"), "\n")-1;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
} catch (\Throwable) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Get maximum number of memory-mapped regions, UNIX only.
|
||||||
|
* Use testFibers to get the maximum number of fibers on any platform.
|
||||||
|
*/
|
||||||
|
public static function getMaxMaps(): ?int
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
return ((int) @\file_get_contents('/proc/sys/vm/max_map_count')) ?: null;
|
||||||
|
} catch (\Throwable) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* Sanify TL obtained from JSON for TL serialization.
|
* Sanify TL obtained from JSON for TL serialization.
|
||||||
*
|
*
|
||||||
|
@ -86,6 +86,8 @@ echo '{
|
|||||||
php $(which composer) update --no-cache
|
php $(which composer) update --no-cache
|
||||||
php $(which composer) dumpautoload --optimize
|
php $(which composer) dumpautoload --optimize
|
||||||
rm -rf vendor/danog/madelineproto/docs vendor/danog/madelineproto/vendor-bin
|
rm -rf vendor/danog/madelineproto/docs vendor/danog/madelineproto/vendor-bin
|
||||||
|
mkdir -p vendor/danog/madelineproto/src/danog/MadelineProto/Ipc/Runner
|
||||||
|
cp vendor/danog/madelineproto/src/Ipc/Runner/entry.php vendor/danog/madelineproto/src/danog/MadelineProto/Ipc/Runner
|
||||||
cd ..
|
cd ..
|
||||||
|
|
||||||
branch="-$BRANCH"
|
branch="-$BRANCH"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user