È PHP adatto per progetti di grandi dimensioni? Può essere transaction-safe?

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

  •  06-09-2019
  •  | 
  •  

Domanda

Questa domanda può apparire strano.

Ma ogni volta che ho fatto progetti di PHP, in passato, ho incontrato questa sorta di brutta esperienza:

Script cancel esecuzione dopo 10 secondi. Ciò si traduce in incoerenze del database molto male (cattivo esempio per un ciclo cancellazione: l'utente sta per eliminare un album fotografico oggetto Album viene eliminato dal database e quindi a metà strada di eliminare le foto lo script viene ucciso a destra dove si trova, e. 10.000 foto sono lasciati senza alcun riferimento).

Non è transaction-safe. Non ho mai trovato un modo per fare qualcosa di sicuro , per garantire che sia Fine . Se lo script viene ucciso, ma viene ucciso. Proprio nel bel mezzo di un ciclo. Ottiene appena ucciso. Che mai accaduto su Tomcat con Java. Java corre e corre e corre, se ci vuole tempo.

C'è un sacco di newsletter-scripts cercare di venire intorno a quel problema, dividendo il lavoro su in un sacco di pacchetti, vale a dire l'invio di 100 alla volta, poi relading pagina (o uomo, veramente stupido), facendo quello successivo, e presto. Il più delle volte qualcosa si blocca o uno script richiede più di 10 secondi, e la vostra piattaforma è paralizzato in su.

Ma poi, ho sentito che molto grandi progetti utilizzano PHP come StudiVZ (il tedesco facebook clone, in realtà il più grande sito tedesco). Quindi c'è una piccola luce di speranza che questo cattivo comportamento viene proprio dalla società di hosting non professionale che ha appena uccidono script php perché i loro server sono così male. Qual è la verità su questo? Può essere configurato in modo tale che gli script non vengono uccisi perché prendono un po 'di più?

Nessuna soluzione corretta

Altri suggerimenti

  

E 'PHP adatto per progetti di grandi dimensioni?

Ogni volta che vedo una domanda del genere, ho un po 'a disagio. Che cosa molto grande significa? Che cosa può essere grande per te, può essere piccolo per me o viceversa. E questo è anche supponendo che usiamo la stessa metrica. Stai misurando il tempo di costruire il progetto, completo del ciclo di vita del progetto, soldi che sono coinvolti, il numero di chi lo utilizza, il numero di sviluppatori di creare / mantenere, ecc ecc.

Detto questo, i problemi che stai descrivendo suona come voi non conoscono la vostra tecnologia abbastanza buono. Questo sarebbe un problema per voi, indipendentemente da quale tecnologia hai scelto. Ad esempio, utilizzare le transazioni di database al fine di garantire l'atomicità. E utilizzare job asincroni non in linea per elaborare attività in esecuzione lunghi (come ad esempio l'invio di una mailing list).

Un sacco se il cattivo comportamento è coperto in buone framework come Zend Framework. Tutto ciò che richiede più tempo dei 10 secondi è veramente incasinato, ma si può sempre aumentare il tempo di esecuzione con http: // DE3. php.net/set_time_limit

Un sacco di grandi siti sono scritti in PHP: Facebook, Wikipedia, StudiVZ, Digg.com ecc .. un sacco di cose che si sta parlando sono solo cose di configurazione forse si dovrebbe guardare in che

?

La prestazione non è una caratteristica che si può semplicemente gettare dopo la maggior parte del sito è fatto. È necessario progettare il sito per carichi pesanti.

Se un'attività database è normalmente coinvolgono 10K righe, si dovrebbe essere preparato non solo i problemi di tempo di esecuzione, ma altre questioni di manutenzione.

  • Caso peggiore: fare uno strumento di coerenza per controllare e correggere tali errori.
  • Meglio:., Invece di fisicamente cancellare le immagini, basta bandiera e lasciare che i servizi in background per prendersi cura delle manovre costosi
  • Best:. Si può utilizzare un servizio di coda di lavoro e aggiungere questo lavoro alla coda

Se si ha bisogno di fare transazioni in php, solo si può fare:

mysql_query("BEGIN");

/// do your queries here

mysql_query("COMMIT");

Il comando commit sarà solo completare la transazione.

In caso di errori, si può semplicemente far ritirare con:

mysql_query("ROLLBACK");

Modifica Nota: questo funziona solo se si sta utilizzando un database che supporta le transazioni, come InnoDB

È possibile configurare quanto tempo consentito per l'esecuzione di uno script, sia nella impostazione php.ini o tramite ini_set / set_time_limit

Invece di StudiVZ (il tedesco Facebook clone), si poteva guardare il Facebook effettivo che è interamente in PHP. O Digg. O molti siti Yahoo. O molti, molti altri.

ignore_user_abort è probabilmente quello che stai cercando, ma si potrebbe anche aggiungere un altro strato in termini di posti di lavoro di manutenzione programmata. In sostanza eseguiti su un determinato intervallo e fare diverse cose per assicurarsi che i dati / file system sono in uno stato che si desidera ... cancellando le vecchie lime / non collegati è solo una delle tante cose che si possono fare.

Per queste grandi anse, come l'eliminazione di album fotografici o l'invio di 1000 di messaggi di posta elettronica alla ricerca di tuo ignore_user_abort e set_time_limit.
Qualcosa di simile a questo:

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

Fate attenzione, tuttavia, che questo potrebbe potenzialmente eseguire lo script per 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();

Questo script non morirà mai, a meno che non si riavvia il server.

Quindi è meglio non impostare il time_limit il 0.

Tecnicamente non è linguaggio di programmazione transazione sicura, è la base di dati che deve essere sicuro di transazione. Quindi, se lo script / codice di esecuzione muore o si disconnette, per qualsiasi motivo, la transazione verrà eseguito il rollback.

Mettere query in un ciclo è una pessima idea, a meno che non sia specificatamente progettare per essere in esecuzione in lotti e rompendo un insieme molto più grande in parti più piccole. Regolazione timer PHP e limiti è generalmente una soluzione gap stop, non si è ancora dipendente dal browser del client se si utilizza il web per dare il via uno script.

Se ho un lungo processo che deve essere dato il via da un browser, I "disconnessione" il processo dal server browser e web in modo controllo viene restituito all'utente, mentre lo script viene eseguito. script PHP eseguito da riga di comando può essere eseguito per ore se si vuole. È quindi possibile utilizzare AJAX, o ricaricare la pagina, per verificare l'avanzamento dello script lunga esecuzione.

Non ci sono preoccupazioni di sicurezza con questo codice, ma a "staccare" un processo da PHP in esecuzione in qualcosa come Apache:

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

Ma che in realtà non ha nulla a che fare con PHP essendo adatto per progetti di grandi dimensioni o di essere transazione sicura. PHP può essere usato per i grandi progetti, ma dato che di default non esiste un codice che rimane "residente" tra i colpi, si può ottenere lento se non progettati a destra. Inoltre, poiché non v'è alcun supporto dello spazio dei nomi, si vuole pianificare in anticipo se si dispone di un grande team di sviluppo.

E 'bene per un sistema basato su Java per prendere un paio di minuti per l'avvio, inizializzare e caricare tutti gli oggetti predefiniti. Ma questo è inaccettabile con PHP. PHP ci vorrà più di pianificazione per sistemi più grandi. La domanda è, quando fa il tempo risparmiato utilizzando PHP ottenere sprecato dal tempo di pianificazione supplementare necessario per un grande sistema?

Il motivo è più probabile vissuto male consistenze di database in passato è perché si stava utilizzando il motore MyISAM per MySQL (che non supporta transazioni). Uso InnoDB invece, supporta transazioni ed esegue il blocco a livello di riga. Oppure utilizzare PostgreSQL.

Molti, molti siti di software sono realizzati in PHP. Tuttavia, non si sente di milioni di pagine web in PHP che non esistono più perché sono stati abbandonati. Quelle pagine possono aver bruciato tutti i soldi dell'azienda per trattare con PHP pasticcio, o forse in bancarotta perché la loro morbida era così scadente che il cliente non lo voleva ... PHP sembra buona all'avvio, ma non scala molto bene. Sì, ci sono molti siti web enormi in PHP, ma sono piuttosto delle eccezioni, di una norma.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top