2010-05-10 2 views
4

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

Ваше мнение?

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

ответ

3

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

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

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

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

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

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

+0

По теме ImageMagick: ознакомьтесь с блогом разработчиков PHP Imagick для некоторых интересных примеров: http://valokuva.org/?cat=1 – janmoesen

0

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

0

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

1

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

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

0

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

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

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

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

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

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

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

Если бы я был сделать много сетевых задач, таких как MX Lookups/рытье/извлечения

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

Смежные вопросы