Вам нужен Composer для асинхронного PHP и HTTP-сервер, такой как ReactPHP или Swoole?

Насколько я понимаю, Composer используется для автоматической загрузки классов через функцию SPL, предоставляемую PHP, или, по крайней мере, для регистрации метода для вызова, когда класс не существует. Затем это должно происходить при каждом запросе традиционной установки, например, с Laravel или CakePHP...

Мой вопрос: как Composer будет работать в ситуации с HTTP-сервером Swoole, когда вы можете предварительно загрузить все заранее? Нужен ли Composer в этом контексте?

Swoole HTTP PHP-сервер в общих чертах выглядит так:

<?php

// Load all your classes and files here?

$http = new swoole_http_server("127.0.0.1", 9501);

$http->on("start", function ($server) {
    echo "Swoole http server is started at http://127.0.0.1:9501\n";
});

$http->on("request", function ($request, $response) {
    $response->header("Content-Type", "text/plain");
    $response->end("Hello World\n");
});

$http->start();

Чтобы я мог загрузить все заранее, не беспокоясь о том, чтобы вызывать какой-либо скрипт автозагрузки?

Тогда все классы будут в глобальной области видимости, поэтому все будет предварительно загружено и готово к использованию в обратном вызове функции ->on("request").


person tty2018    schedule 30.04.2019    source источник
comment
Да, вы могли бы. Так же, как вы могли бы сделать это в любом другом проекте PHP. Но все же гораздо удобнее позволить автозагрузчику позаботиться обо всем. Без него вы вернетесь к управлению операторами require вручную.   -  person Peter    schedule 30.04.2019
comment
@Peter Хорошо, но разве композитор не загружает классы только при их вызове? Или Composer может загрузить все классы сразу?   -  person tty2018    schedule 30.04.2019
comment
Да, классы загружаются, когда это необходимо (потому что так работает автозагрузка).   -  person Peter    schedule 30.04.2019


Ответы (1)


Вы можете использовать composer и его функцию автозагрузки в контексте CLI с помощью Swoole.

В выполнении PHP нет никаких изменений, поэтому автозагрузчик будет работать нормально, просто включите vendor/autoload.php в соответствующий скрипт.

<?php

// Autoloader is now up, you can use new Your/Class;
require_once('vendor/autoload.php'); 

$http = new swoole_http_server("127.0.0.1", 9501);

$http->on("start", function ($server) {
    echo "Swoole http server is started at http://127.0.0.1:9501\n";
});

$http->on("request", function ($request, $response) {
    $response->header("Content-Type", "text/plain");
    $response->end("Hello World\n");
});

$http->start();

Отказ от ответственности: я использую swoole с Laravel, Lumen и пользовательскими решениями (как CLI, так и fastcgi)/web, он отлично работает, и в этом контексте нет никаких изменений в том, как вы работаете с PHP.

person Mjh    schedule 30.04.2019
comment
Но разве это не означает, что классы загружаются тогда, когда они нужны? Я насчет предварительной загрузки всего в первую очередь. Таким образом, перед запуском сервера PHP CLI Swoole каждый класс был определен для PHP. Было бы лучше сначала предварительно загрузить все, не так ли? - person tty2018; 30.04.2019
comment
Да, он будет загружать класс, когда это необходимо. Если вы предварительно загружаете, вы ничего не достигаете - когда класс нужен, он загружается, если еще не загружен. Все последующие вызовы самого файла класса не заставят PHP загружать его снова. Поэтому, если вам удалось предварительно загрузить все - вы ничего не решаете, так как классы загружаются только один раз. По сути, у вас будет один запрос, который будет использоваться для горячего запуска всего. Альтернативой является создание списка всех классов, foreach и вручную require_once каждый файл. Это то, что композитор делает для вас. - person Mjh; 30.04.2019
comment
Я понимаю ваше объяснение. Я думаю, что я, возможно, плохо объяснил свою сторону. Когда я говорю о предварительной загрузке по сравнению с автозагрузчиком Composers, он будет только require, если он вызывается и не определен, оставляя Composer для загрузки класса. Но если бы я предварительно загрузил все классы перед запуском сервера Swoole, Composer не нужен или бесполезен в этом контексте, потому что он не загружает все классы/зависимости сразу? - person tty2018; 30.04.2019
comment
Если бы вы предварительно загружали все самостоятельно, то композитор не был бы нужен. Даже если вы оставите его автозагрузчик в своем коде - он ничего не сделает, поскольку все классы доступны. Однако композитор — это не просто генератор автозагрузчика — вы вероятно использовали бы его для определения зависимостей для вашего проекта swoole. Однако этим вы ничего не добьетесь. Прироста производительности нет, все, что произойдет, это потеря (много) времени. Используйте автозагрузчик композитора. Если только вы действительно не хотите делать это самостоятельно и вручную :) - person Mjh; 30.04.2019