Было бы просто лучше использовать функции системы, а не использовать язык? - PullRequest
4 голосов
/ 10 мая 2010

Есть много сценариев, в которых я ставил под сомнение производительность PHP с некоторыми его функциями, и нужно ли мне создавать сложный класс для обработки определенных вещей, используя его, казалось бы, медленные инструменты.

Например, сложные регулярные выражения с sed и обработка с awk, по-видимому, были бы экспоненциальными по производительности, а не заставляли бы регулярное выражение PHP и, казалось бы, чрезмерные функции анализировать и со временем завершать его. Если бы мне пришлось выполнять много сетевых задач, таких как поиск MX / DIGging / Retrie одновременно, я бы предпочел пропустить это через system() и позволить ОС справиться с этим самостоятельно. В PHP просто слишком много функций, которые неэффективны и приводят к медленным страницам или могут быть легко обработаны ОС.

Каково ваше мнение?

Как вы думаете, я должен выполнять тяжелую работу с ОС в ее собственных / пользовательских функциях?

Ответы [ 5 ]

3 голосов
/ 10 мая 2010

Системные вызовы очень часто могут быть быстрее, чем использование решения, встроенного в PHP (хотя это не всегда верно, поскольку сами функции PHP создаются и компилируются в C. Многие основные функции и расширения PHP работают довольно быстро).

Помимо скорости, вторым фактором является ограничение памяти.Внешне вызываемые процессы не поглощают ограничение PHP для каждого сценария, что может быть полезно при работе, например, с большими файлами.

Кроме того, некоторые функции просто недоступны в самом PHP.Например, невозможно полностью имитировать набор функций ImageMagick в PHP.Библиотека GD не приближается к тому, что может предложить ImageMagick.

Большой, большой минус в том, что с помощью системных команд вы эффективно устраняете переносимость, которая является частью красоты PHP.Перемещение приложения на другой сервер становится огромным бременем, потому что набор функций внешних команд должен быть одинаковым - и это не всегда так даже в разных дистрибутивах Linux, не говоря уже о пересечении границы ОС в Windows или UnixMac OS на базеЯ сам испытывал проблемы с wget и ImageMagick в этом отношении, я уверен, что их гораздо больше.

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

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

1 голос
/ 10 мая 2010

Даже если системные процессы быстрее и занимают меньше памяти (здесь необходимо тщательное тестирование), есть кое-что, о чем следует помнить:

Я буду осторожен с использованием вызовов system() и использую его только в том случае, если вы управляете оборудованием, на котором будет работать ваш скрипт. Использование этих вызовов может привести к необходимости установки дополнительного программного обеспечения / пакетов и может не работать (одинаково) на всех ОС, поэтому, если вы не можете управлять сервером, я бы придерживался PHP-функций.

0 голосов
/ 10 мая 2010

(По моему опыту, «системные вызовы» обычно относятся к вызовам операций ядра - не вызывая другие программы - «пропустите его через system () и позвольте ОС справиться с этим» - вы, кажется, думаете так же - но ни один из программы, которые вы упоминаете, являются службами ОС - это просто другие программы).

PHP, по сути, является языком сценариев, которые обычно являются просто связующим звеном для перемещения данных между другими программами, но некоторые вещи следует учитывать:

1) производительность - создание нового процесса может быть вычислительно дорогим

2) безопасность - предоставление вашему веб-серверу неограниченного доступа ко всем программам в системе (даже ограниченным разрешениями) потенциально очень опасно

3) имея в виду (2) большинство конфигураций будут препятствовать или ограничивать то, что вы можете сделать

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

5) Вы можете довольно легко написать собственный PHP-код расширения

Если бы мне пришлось выполнять множество сетевых задач, таких как поиск MX / DIGging / Retrieving

Хотя я мог бы полагать, что объединение больших массивов данных с помощью awk / sed может быть быстрее / эффективнее, чем собственный код PHP, я нахожу несколько удивительным, что поиск DNS быстрее с использованием другого клиента. Как вы это измерили?

0 голосов
/ 10 мая 2010

Я бы сказал, что если ваша программа предназначена для выполнения в оболочке с использованием других внешних программ, таких как sed / awk, то это нормально, так как сценарии оболочки также чрезмерно используют внешние программы, а скрипт php, запускаемый в оболочке, похож на оболочку сценарий, просто на другом языке. Однако, если это веб-приложение, лучше сделать это в php - большинство сред общего хостинга не позволяют запускать внешние программы из сценариев php.

0 голосов
/ 10 мая 2010

Я думаю, что на самом деле это будет медленнее, потому что каждый раз, когда вы вызываете такую ​​функцию, ОС запускает новый процесс, и это отнимает много времени.

...