Подходит ли PHP для очень больших проектов? Это может быть безопасным для транзакций? - PullRequest
4 голосов
/ 01 июня 2009

Этот вопрос может показаться странным.

Но каждый раз, когда я делал проекты PHP в прошлом, я сталкивался с таким плохим опытом:

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

Это не безопасно для транзакций. Я никогда не находил способ сделать что-то безопасным , чтобы убедиться, что это сделано . Если сценарий будет убит, он будет убит. Прямо в середине цикла. Это просто убито. Этого никогда не случалось на коте с Java. Java работает, работает и работает, если это занимает много времени.

Многие сценарии рассылки новостей пытаются решить эту проблему, разбивая работу на множество пакетов, то есть отправляя по 100 за раз, затем связывая страницу (о, боже, очень глупо), делая следующую, и скоро. Чаще всего что-то зависает или сценарий занимает больше 10 секунд, и ваша платформа повреждена.

Но потом, я слышал, что очень большие проекты используют PHP как studivz (немецкий клон facebook, на самом деле самый большой немецкий сайт). Таким образом, есть небольшая надежда, что это плохое поведение исходит от непрофессиональных хостинговых компаний, которые просто убивают php-скрипты, потому что их серверы такие плохие. Что правда об этом? Можно ли настроить его так, чтобы сценарии никогда не убивались, потому что они занимают немного больше времени?

Ответы [ 11 ]

14 голосов
/ 01 июня 2009

Подходит ли PHP для очень больших проектов?

Всякий раз, когда я вижу такой вопрос, мне становится немного не по себе. Что означает очень большой ? Что может быть большим для вас, может быть маленьким для меня или наоборот. И это даже при условии, что мы используем одну и ту же метрику. Вы измеряете время, чтобы построить проект, полный жизненный цикл проекта, деньги, которые вовлечены, количество людей, использующих его, количество разработчиков, чтобы построить / поддерживать его и т. Д. И т. Д.

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

6 голосов
/ 01 июня 2009

Много, если плохое поведение покрыто хорошими фреймворками, такими как Zend Framework. Все, что занимает больше 10 секунд, действительно испорчено, но вы всегда можете увеличить время выполнения с помощью http://de3.php.net/set_time_limit

На PHP написано много крупных сайтов: Facebook, Википедия, StudiVZ, Digg.com и т. Д. Многие вещи, о которых вы говорите, - это просто настройки, возможно, вам стоит взглянуть на это?

4 голосов
/ 01 июня 2009
3 голосов
/ 01 июня 2009

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

Если задача базы данных обычно включает 10К строк, вам следует подготовиться не только к проблемам времени выполнения, но и к другим вопросам обслуживания.

  • Наихудший случай: создайте инструмент согласованности для проверки и исправления этих ошибок.
  • Лучше: вместо физического удаления изображений просто пометьте их и разрешите фоновым службам позаботиться о дорогостоящих маневрах.
  • Лучше: вы можете использовать службу очереди заданий и добавить это задание в очередь.
2 голосов
/ 01 июня 2009

Если вам нужно сделать транзакции в php, вы можете просто сделать:

mysql_query("BEGIN");

/// do your queries here

mysql_query("COMMIT");

Команда commit просто завершит транзакцию.

Если возникнут какие-либо ошибки, вы можете просто выполнить откат:

mysql_query("ROLLBACK");

Редактировать: Обратите внимание, это будет работать, только если вы используете базу данных, которая поддерживает транзакции, например InnoDB

1 голос
/ 01 июня 2009

Вместо studivz (немецкий клон Facebook), вы можете посмотреть на настоящий Facebook, который полностью PHP. Или Digg. Или много сайтов Yahoo. Или много, много других.

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

1 голос
/ 01 июня 2009

Вы можете настроить, сколько времени отводится на выполнение скрипта, либо в настройке php.ini, либо через ini_set / set_time_limit

0 голосов
/ 02 июня 2009

Причина, по которой вы, скорее всего, испытывали плохую согласованность базы данных в прошлом, заключается в том, что вы использовали движок MyISAM для mysql (который НЕ поддерживает транзакции). Вместо этого используйте InnoDB, он поддерживает транзакции и выполняет блокировку на уровне строк. Или используйте postgreSQL.

0 голосов
/ 01 июня 2009

Технически ни один язык программирования не является безопасным для транзакций, это база данных, которая должна быть безопасной для транзакций. Поэтому, если выполняемый скрипт / код по какой-либо причине умирает или отключается, транзакция будет откатываться.

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

Если у меня есть длинный процесс, который должен быть запущен браузером, я «отключаю» процесс от браузера и веб-сервера, чтобы контроль возвращался пользователю во время выполнения скрипта. PHP-скрипты, запускаемые из командной строки, могут работать часами, если хотите. Затем вы можете использовать AJAX или перезагрузить страницу, чтобы проверить ход выполнения долгосрочного сценария.

Есть проблемы безопасности с этим кодом, но чтобы «отключить» процесс от PHP, работающего под чем-то вроде Apache:

exec("nohup /usr/bin/php -f /path/to/script.php > /dev/null 2>&1 &");

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

Хорошо для системы на основе Java потратить несколько минут на запуск, инициализацию и загрузку всех объектов по умолчанию. Но это недопустимо с PHP. PHP будет больше планировать для больших систем. Вопрос в том, когда время, сэкономленное при использовании PHP, теряется на дополнительное время планирования, необходимое для большой системы?

0 голосов
/ 01 июня 2009

Для таких больших циклов, как удаление фотоальбомов или отправка 1000 электронных писем, вы ищете ignore_user_abort и set_time_limit.
Как то так:

ignore_user_abort(true); //users leaves webpage will not kill script
set_time_limit(0); //script can take as long as it wants
for(i=0;i<10000;i++)
 costly_very_important_operation();

Будьте осторожны, однако, это может запустить скрипт навсегда:

ignore_user_abort(true); //users leaves webpage will not kill script
set_time_limit(0); //script can take as long as it wants
while(true)
  do_something();

Этот скрипт никогда не умрет, если вы не перезапустите сервер.

Поэтому лучше никогда не устанавливать time_limit 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...