Подходит ли PHP для очень больших проектов?Может ли это быть безопасным для транзакций?

StackOverflow https://stackoverflow.com/questions/934236

  •  06-09-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

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

Нет правильного решения

Другие советы

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

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

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

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

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

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

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

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

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

mysql_query("BEGIN");

/// do your queries here

mysql_query("COMMIT");

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

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

mysql_query("ROLLBACK");

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

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

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

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

Для таких больших циклов, как удаление фотоальбомов или отправка 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.

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

Помещение запросов в цикл - очень плохая идея, если только она специально не предназначена для пакетного выполнения и разбиения гораздо большего набора на более мелкие части.Настройка таймеров и ограничений 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, тратится впустую из-за дополнительного времени планирования, необходимого для большой системы?

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top