Вызов внешней библиотеки из PHP.Что быстрее: exec или расширение? - PullRequest
1 голос
/ 13 июня 2010

Мне нужно позвонить с веб-страницы во внешнюю библиотеку, написанную на C ++, и отобразить результат. Платформа Linux, Apache, PHP.

Моя текущая идея - использовать сервис PHP, который будет вызывать мою библиотеку / программу. Я обнаружил, что есть два возможных способа сделать это: 1) использовать функцию PHP 'exec' 2) написать расширение PHP

Мне интересно, что работает эффективнее? Быстрее? Меньше загружать сервер?

Мне, вероятно, нужно будет делать 4 вызова в секунду, поэтому я хочу быть максимально оптимальным.

P.S. Если вам известен какой-либо другой (более эффективный) способ вызова библиотеки или программы C ++ с веб-страницы, сообщите мне.

Большое спасибо,
Робуста

Ответы [ 5 ]

8 голосов
/ 13 июня 2010

Расширение теоретически быстрее, поскольку оно позволяет избежать затрат на создание нового процесса.Это также «более чистое» решение (нет неуклюжих аргументов программы; вы можете анализировать произвольные значения PHP, такие как объекты, а не только строки и т.который использует эту библиотеку, вам будет проще просто выполнить ее, а не писать расширение.

Обратите внимание, что если вы делаете только 4 вызова в секунду, в плане производительности не имеет значения, какой метод вы используете, если толькобиблиотека требует дорогой инициализации, которой можно избежать, если сохранить постоянное состояние (перекрестный запрос) в расширении PHP.

4 голосов
/ 13 июня 2010

Execs определенно медленнее, чем вызов скомпилированного расширения PHP. Ext_skel - твой близкий друг.

EDIT: Нет ничего теоретического в том, что exec медленнее встроенного расширения. Как насчет запуска strace и проверки количества системных вызовов, выполняемых exec внутри сценария PHP и вызова скомпилированного расширения.

Вот некоторые тесты:

Система: VMWARE Workstation, C2DUO E8400, 2 ГБ ОЗУ

** Выполнено 4 раза:

время ./a.php (EXEC)

реальный 0m0,944 с
пользователь 0m0.700s
sys 0m0,244s

time ./b.php (PHP EXTENSION)

реальный 0m0.268s
пользователь 0m0.212s
sys 0m0,056 с

** Выполнено 1000 раз:

время ./a.php (EXEC)

реальный 3m47.042s
пользователь 2m48.239s
sys 0m56,784s

time ./b.php (PHP EXTENSION)

реальный 3m36.631s
пользователь 2m46.922s
sys 0m49.627s

Я не думаю, что это нуждается в каком-либо объяснении. Скомпилированное расширение работает быстрее, более экологично, экономит время процессора. Считается лучше. Также с помощью расширений вы можете повторно использовать ресурсы. Что делать, если вы хотите создать 10 разных версий из одного изображения? Тогда вам не нужно каждый раз воссоздавать объект new imagick('filename');.

time ./bx.php (РЕСУРС РЕСУРСА РАСШИРЕНИЯ PHP)

реальный 0m3.712s
пользователь 0m3.552s
sys 0m0,156s

Содержание сценария A:

#!/usr/bin/php5
<?php

for ($i=0; $i < 1000; $i++)
{
    exec('/usr/bin/convert -thumbnail 150 src1.jpg dst.jpg');
}

?>

Содержание сценария B:

#!/usr/bin/php5
<?php

for ($i=0; $i < 1000; $i++)
{
    $img = new imagick('src1.jpg');
    $img->thumbnailImage( 150, null );
    $img->writeImage('dst.jpg');
} //for

?>

Содержание скрипта bx:

#!/usr/bin/php5
<?php

$img = new imagick('src1.jpg');
for ($i=0; $i < 1000; $i++)
{
    $img->thumbnailImage( 150, null );
    $img->writeImage('dst.jpg');
} //for

?>

Скрипт STACKTRACE с вилками (простой запуск): LINK

Скрипт b STACKTRACE с вилками (простой запуск): LINK

1 голос
/ 13 июня 2010

Если вы хотите сэкономить на написании расширения php (exec слишком медленный), вы можете написать какой-нибудь веб-сервис используемой вами библиотеки (например, с XML-RPC или SOAP / REST) ​​и вызватьэто из вашего PHP-кода.

Это должно быть проще для отладки (просто регистрируйте сделанные вами запросы и воспроизводите их), а также проще для разделения (необходимо выполнить одну часть на другом хосте по разным причинам?: P)

0 голосов
/ 13 июня 2010

Скорость против Переносимости.Если вы связываете другую библиотеку с PHP, вы должны держать ее обновленной;следовательно, нужна система сборки или, что еще лучше, специальный пакет для вашего дистрибутива.Это практически не имеет большого значения.Но все еще проще просто использовать утилиту командной строки, когда она доступна.

Так что, если это библиотека, которую можно использовать в режиме сеанса (множественные вызовы, адаптировать среду), вам определенно следует создать оболочку.Если вы не вызываете его> 10 раз в секунду, разница в скорости незначительна.Затем перейдите к методу execve ().Это способ Unix, и на самом деле он более надежен, если у вашего приложения определенный срок жизни.

0 голосов
/ 13 июня 2010

Что касается меня, то WebService намного медленнее, чем программа exe.Но имеет преимущество независимости от платформы, как сказал ZeisS .

И я полностью согласен с Эмилем Викстром .Рассмотрим пример: в вашем доме (системе) вы (ОС) отдадите предпочтение членам семьи (exe), а не гостям (webservice).В случае рекурсивных функций exe будет работать намного быстрее, чем веб-сервисы.

...