PHP é adequado para projetos muito grandes? ele pode ser transação-safe?

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

  •  06-09-2019
  •  | 
  •  

Pergunta

Essa pergunta pode parecer estranha.

Mas cada vez que eu fiz projetos PHP no passado, eu encontrei esse tipo de experiência ruim:

Scripts cancelar execução após 10 segundos. Isso resulta em inconsistências de banco de dados muito ruins (mau exemplo para um loop de exclusão: usuário está prestes a excluir um álbum de fotos Album objeto é excluído do banco de dados e, em seguida, metade do caminho para baixo de apagar as fotos do script é morto direito onde está, e. 10.000 fotos são deixados sem referência).

Não é transação-safe. Eu nunca encontrei uma maneira de fazer algo segurança , para garantir a sua feito . Se o script for morto, ele é morto. Bem no meio de um loop. Ele fica acabado de matar. Isso nunca aconteceu no tomcat com java. Java é executado e corre e corre, se leva muito tempo.

O lote de boletim-scripts tentar chegar em torno desse problema dividindo o trabalho-se em um monte de pacotes, ou seja, o envio de 100 de cada vez, em seguida, relading a página (oh homem, realmente estúpido), fazendo o próximo, e em breve. Na maioria das vezes trava algo ou script irá demorar mais do que 10 segundos, e sua plataforma é aleijada.

Mas então, eu ouvi que muito grandes projectos usar o PHP como studivz (o clone facebook alemão, na verdade, o maior site de alemão). Portanto, há uma pequena luz de esperança de que esse comportamento ruim apenas vem de empresas de hospedagem não profissionais que apenas matar scripts PHP porque seus servidores são tão ruins. Qual é a verdade sobre isso? ele pode ser configurado de tal forma, que os scripts nunca se matou porque eles demoram um pouco mais?

Nenhuma solução correta

Outras dicas

é PHP adequado para projetos muito grandes?

Sempre que vejo uma pergunta como essa, eu recebo um inquieto pouco. O que muito grande média? O que pode ser grande para você, pode ser pequeno para mim, ou vice-versa. E isso é mesmo assumindo que usamos a mesma métrica. Você está medindo o tempo para construir o projeto, ciclo de vida completo do projeto, o dinheiro que estão envolvidos, número de pessoas usando-o, número de desenvolvedores para construir / manter, etc etc.

Dito isto, os problemas que você está descrevendo soa como você não sabe o seu tecnologia suficientemente bom. Isso seria um problema para você, independentemente do que a tecnologia que você escolheu. Por exemplo, usar transações de banco de dados para garantir atomicidade. E utilizar trabalhos off-line assíncronos para processar tarefas de longa execução (como envio de uma lista de discussão).

Um monte se o mau comportamento é coberto em bons frameworks como o Zend Framework. Tudo o que leva mais tempo a 10 segundos é realmente confuso, mas você sempre pode aumentar o tempo de execução com http: // de3. php.net/set_time_limit

Um monte de grandes sites são escritas em PHP: Facebook, Wikipedia, StudiVZ, Digg.com etc .. um monte de coisas que você está falando são apenas coisas de configuração talvez você deve olhar para isso

?

O desempenho não é um recurso que você pode simplesmente jogar depois da maioria do site é feito. Você tem que projetar o site para carga pesada.

Se uma tarefa de banco de dados é normalmente envolvendo 10K linhas, você deve estar preparado não apenas as questões de tempo de execução, mas as perguntas outra manutenção.

  • Na pior das hipóteses: fazer uma ferramenta de consistência para verificar e corrigir esses erros.
  • Melhor:., Em vez de eliminar fisicamente as imagens, apenas flag-los e deixá serviços em segundo plano para cuidar das manobras caros
  • Melhor:. Você pode utilizar um serviço de fila de trabalho e adicione tarefa para a fila

Se você precisa fazer transações em php, você pode apenas fazer:

mysql_query("BEGIN");

/// do your queries here

mysql_query("COMMIT");

O comprometer comando só vai completar a transação.

Se ocorrer algum erro, você pode apenas rollback com:

mysql_query("ROLLBACK");

Editar: Nota isso só funcionará se você estiver usando um banco de dados que as transações suportes, tais como InnoDB

Você pode configurar quanto tempo é permitido para executar um script, seja na configuração php.ini ou através ini_set / set_time_limit

Em vez de studivz (o clone alemão Facebook), você pode olhar para o Facebook real que é inteiramente PHP. Ou Digg. Ou muitos sites do Yahoo. Ou muitos, muitos outros.

ignore_user_abort é provavelmente o que você está procurando, mas você também pode adicionar outra camada em termos de trabalhos de manutenção programados. Eles basicamente executado em um intervalo especificado e fazer várias coisas para se certificar de seus dados / sistema de arquivos estão em um estado que você quer ... a exclusão de arquivos antigos / desvinculado é apenas uma das muitas coisas que você pode fazer.

Para esses grandes loops como exclusão de álbuns de fotos ou o envio de 1000, de e-mails a sua procura de ignore_user_abort e set_time_limit.
Algo parecido com isto:

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();

Tenha cuidado, porém, que isso poderia executar o script para sempre:

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();

Esse script nunca vai morrer, a menos que você reiniciar o servidor.

Por isso, é melhor para não definir o time_limit a 0.

Tecnicamente nenhuma linguagem de programação é seguro transação, que é o banco de dados que precisa ser seguro transação. Portanto, se o script / código em execução morre ou desconexões, por qualquer motivo, a transação será revertida.

Pondo consultas em um loop é uma idéia muito ruim se não for projetar especificamente para ser executado em lotes e quebrar um conjunto muito maior em pedaços menores. Ajustar temporizadores PHP e limites é geralmente uma solução abertura de batente, você ainda são dependentes de navegador do cliente se estiver usando a web para lançar um script.

Se eu tiver um longo processo que precisa ser expulso por um navegador, eu "desligar" o processo do servidor navegador e web para que o controle é retornado para o usuário enquanto o script é executado. scripts PHP são executados a partir da linha de comando pode ser executado por horas, se quiser. Você pode então usar AJAX, ou recarregar a página, para verificar o progresso do script de longa duração.

Há preocupação de segurança com este código, mas para "desligar" um processo de PHP rodando sob algo como Apache:

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

Mas isso realmente não tem nada a ver com PHP sendo adequado para grandes projectos ou ser seguro transação. PHP pode ser usado para grandes projetos, mas desde que por padrão não existe um código que resta "residente" entre hits, ele pode ficar lento se não foi concebido direita. Além disso, como não há suporte namespace, você quer planejar com antecedência se você tem uma equipe de desenvolvimento de grande porte.

É bom para um sistema baseado em Java para levar alguns minutos para o arranque, inicialização e carregar todos os objetos padrão. Mas isso é inaceitável com PHP. PHP terá mais planejamento para sistemas maiores. A questão é, quando é que o tempo economizado em usar PHP obter desperdiçado pelo tempo de planejamento adicional necessário para um grande sistema?

A razão que você provavelmente experimentou consistências de banco de dados ruins no passado é porque você estava usando o motor MyISAM para mysql (que não suporta transações). Use InnoDB em vez disso, ele suporta transações e executa bloqueio de nível de linha. Ou usar o PostgreSQL.

Muitos, muitos sites de software são feitos em PHP. No entanto, você não vai ouvir falar de milhões de páginas web feitas em PHP que não existem mais porque eles foram abandonados. Essas páginas podem ter queimado todo o dinheiro da empresa para lidar com PHP bagunça, ou talvez eles faliu porque sua suave foi tão ínfima que o cliente não queria que ... PHP parece bom no arranque, mas não escala muito bem. Sim, existem muitos sites grandes feitos em PHP, mas eles são bastante exceções, que uma norma.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top