I rifiuti transitori vengono raccolti?
-
-
teoricamente dovrebberoessere rimossi quando vieneeseguito cron (se sono scaduti)theoretically they should be removed when cron is run (if they are expired)
- 0
- 2011-01-09
- onetrickpony
-
@Ambitious Amoeba Non vedonulla con quellafunzionalità agganciata a cron.Questo èilmotivoper cui lo chiedo: sembraessere unpresupposto chenon sono sicuro sia valido.@Ambitious Amoeba I do not see anything with that functionality hooked to cron. That is why I am asking - it seems to be an assumption I am not sure is valid.
- 0
- 2011-01-09
- Rarst
-
Mi risulta chei transientinon siano realmente veriprocessi cron,richiedono almeno che qualcuno richieda unapaginaperpoteressere creati/rimossi (ma è la cosamigliore dopo un veroprocesso cron).Non homonitoratoi mieitransitori,vedete chei transitori restano spessoin giro dopo la scadenza?It's my understanding that transients are not really real cron processes, they at least require someone to request a page in order for them to be created/removed(but it's the next best thing to a real cron process). I've not monitored my transients, are you seeing transients hang around often after expiry?
- 0
- 2011-01-09
- t31os
-
@t31os sì,li vedo appesi,manon hoinformazioni su quantotempopossono rimanere appesiprima che sipossa dire definitivamente chenon sono raccoltinella spazzatura@t31os yes I do see them hanging, but I have no information on how long they can hang before it can be said definitively that they are not garbage collected
- 0
- 2011-01-09
- Rarst
-
@ Rarst - Non sono sicuro di come sia determinata lapulizia,vedi questoproblema contransitoriparticolari o diversi?@Rarst - I'm not sure how cleanup is determined either, are you seeing this problem with any particular transients or differing ones?
- 0
- 2011-01-09
- t31os
-
@t31os Non hointenzione diperderetempo a codificarei transienti che registranoi congegniprima di sapere se si suppone che vengano raccoltinella spazzatura.:)@t31os I am not going to waste time on coding transients logging contraption before I know if they are supposed to be garbage collected at all. :)
- 0
- 2011-01-09
- Rarst
-
@Rarst - Beatsme mate,volevo solo condividere alcunipensieri .. :)@Rarst - Beats me mate, just wanted to share a few thoughts.. :)
- 0
- 2011-01-09
- t31os
-
sembra chei transienti scaduti vengano cancellati quando "get_transient" si spegne - http://core.trac.wordpress.org/browser/tags/3.0.4/wp-includes/functions.php#L721it seems that expired transients are deleted when `get_transient` fires off - http://core.trac.wordpress.org/browser/tags/3.0.4/wp-includes/functions.php#L721
- 0
- 2011-01-09
- onetrickpony
-
Quindinon dovresti vedere alcuntransitorio scadutonel db,ameno che qualcosanon sia andato storto con delete_option ()So you shouldn't see any expired transients in the db, unless something went wrong with delete_option()
- 0
- 2011-01-09
- onetrickpony
-
@Ambitious Amoeba sì,l'homenzionatoin questione.Ilpunto è che la creazionetransitorianonpresupponenégarantisce che verràmai richiesta.Sottolineando la domanda originale - ** quandoe seiltransitorio scaduto vieneeliminato senon lo _get_mai? **@Ambitious Amoeba yeah, I kinda mentioned that in question. My point is - transient being created doesn't assume or guarantee that it is ever going to be requested. Stressing the original question - **when and if expired transient gets deleted if I never _get_ it?**
- 1
- 2011-01-09
- Rarst
-
ma qual èilpunto di usarei transienti allora?but what's the point of using transients then?
- 0
- 2011-01-09
- onetrickpony
-
@Ambitious Amoebailpunto è chei transitori sono unmeccanismo di caching.Il concetto di cachepresuppone chei dati sianoin scadenzae non sipresume chegli hitgarantiti.Se la cachenonpuliscei dati scaduti,staperdendo risorse.@Ambitious Amoeba the point is that transients are caching mechanism. Cache concept assumes expiring data and doesn't assume guaranteed hits. If cache doesn't cleanup expired data then it is leaking resources.
- 0
- 2011-01-09
- Rarst
-
presuppone chetupuliscai dati scaduti,ma sì,hai ragione,ci sono situazioniin cuinon verrebbemai cancellato.Come rimuovere un widget che utilizzatransitori.Dovrestiinviare unticket sultracper questo :)it asssumes you clean up the expired data, but yes, you're right, there are situations in which it would never get deleted. Like removing a widget which uses transients. You should submit a ticket on the trac for this :)
- 1
- 2011-01-09
- onetrickpony
-
@Rarst - Sembra una cosaperfettaper scrivere unapatche inviarla atrac?@Rarst - Sounds like a perfect thing to write a patch for and submit to trac?
- 1
- 2011-01-09
- MikeSchinkel
-
@MikeSchinkel yeaaaah ... dopo che qualcuno ha risposto definitivamente sei dannatitransitori sono (o dovrebberoessere) spazzatura raccolta :)@MikeSchinkel yeaaaah... after someone answers definitively at last if damn transients are (or are supposed to be supposed to be) garbage collected :)
- 0
- 2011-01-09
- Rarst
-
@Rarst - L'unicomodoper dirlo con certezza ditracciareil codice ...@Rarst - The only way to tell for sure it to trace through the code...
- 0
- 2011-01-10
- MikeSchinkel
-
Non ènecessario che vengano "raccoltinella spazzatura".Senon li recuperimai,nonimporta se sonopresenti omeno.They don't need to be "garbage collected". If you never fetch them, then it doesn't matter if they're there or not.
- 0
- 2011-09-12
- Otto
-
@Otto seinizi ad avere ** decine dimigliaia ** ditali voci di spazzaturanellatabella delle opzioni (cosa chepuò accaderein pratica,vedi domanda collegata) Penso che sia abbastanzaimportante,no?@Otto if you start to have **tens of thousands** of such garbage entries in options table (which can and does happen in practice, see linked question) I think it quite matters, no?
- 0
- 2011-09-12
- Rarst
-
No,davveronon lo è.I databasepossono conteneremilionie milioni di righe senza rallentamenti apprezzabili.Si chiama "indicizzazione"e rimane veloce anche contantee tante righe: http://en.wikipedia.org/wiki/Index_(database). Inoltre,la chiamata di SQL DELETE su diessinon lieliminaeffettivamente dal database.Li rimuove semplicemente dall'indice,fino a quandononesegui anche un'ottimizzazione dellatabella sullatabella,che è un'operazione di lunga durata.Ingenerenon ènecessario "ripulire"i recordin un database.Lascia cheil databasefacciail suo lavoro.Èpiùbravo dite.No, it really doesn't. Databases can have millions and millions of rows in them without appreciable slowdown. It's called "indexing", and it stays fast as heck even with lots and lots of rows: http://en.wikipedia.org/wiki/Index_(database). What's more, calling the SQL DELETE on them doesn't actually delete them from the database. It just removes them from the index, until you do an OPTIMIZE TABLE on the table as well, which is a long running operation. There is generally no need to "clean up" records in a database. Let the database do its job. It's better at it than you are.
- 0
- 2011-09-12
- Otto
-
Peresserepiùprecisi,potrestinotare chei transitorinel database hannoilflag di caricamento automaticoimpostato su "no",il che significa chenon vengono caricati all'avvio.Il rallentamentoprincipale di qualsiasi query di database è l'effettivotrasferimento di dati dal database alprogramma.Le query stesse,se scritte correttamentee correttamenteindicizzate (il che significa che la querynon causa una scansione dellatabella),non richiedonopraticamentetempo al confronto.Nonimporta se hai 100 record o 100.000,poichéeseguire una semplice SELEZIONE su un campoindicizzato è un'operazione O (log (n)).Questonon cambia davverofino a quandonon ottieni 1milione di record ogiù di lì.To be more specific about it, you may notice that transients in the database have their autoload flag set to "no" which means they don't get loaded on startup. The primary slowdown from any database query is the actual data transfer from the database to the program. Queries themselves, if written correctly and properly indexed (meaning the query doesn't cause a table scan), take virtually no time by comparison. Doesn't matter if you have 100 records or 100,000, as doing a simple SELECT on an indexed field is an O(log(n)) operation. This doesn't really change until you get 1M+ records or so.
- 0
- 2011-09-12
- Otto
-
@Otto Potresti spostarloin una rispostain modo che leinformazioni sianopiù visibili?Non sostengo che ci vorrannomolte voci di spazzaturaper rovinare le cose ... Ma se qualcosaperde risorse (cosa che accadefacilmente coni transitoriperché hanno un limite di lunghezza della chiave chenon è controllato,èfacilegenerarne craploadenontoccaremaipiùperché la chiave è rotta)poiprima opoi rovinerà le cose.Non stogridando "aggiustalonel core",manon vedonemmeno lapulizia comeinutile.@Otto Could you please move this to an answer so information is more visible? I do not argue that it will take a lot of garbage entries to screw things up... But if anything is leaking resources (which easily happen with transients because they have key length limit that is not checked, easy to generate crapload of them and never touch again because key is broken) then sooner or later it will screw things up. I am not screaming "fix this in core", but I don't see cleanup as useless either.
- 0
- 2011-09-12
- Rarst
-
"Rovinare le cose" è un'affermazione unpo 'vaga.Ilmassimo cheposso vedere accadere è cheil database diventatroppograndeper uno spazio di account limitato.In realtànon romperànullafinchénon diventerà davveromolto,moltogrande.Lavoro contabelle che contengono 20milioni di record.Cercarli è unpo 'lento,manonin modoirragionevole.Hai ragione riguardo al limite di lunghezza della chiave,ma 45 caratteri sono sufficientiper ogni caso realistico a cui riesco apensare.Vabene,certo,èpossibilefare qualcosa dipazzo,ma succede spesso?Sembra che l'autore delplug-in debba ricevere unanotificainvece di una soluzione alternativa ..."Screw things up" is a bit of a vague statement. The most that I can see happening is that the database gets too large for a limited account space. It's not going to actually break anything until it gets very, very large indeed. I work with tables that have 20 million records in them. Searching them is a bit slow, but not unreasonably so. You're correct about the key length limit, but 45 chars is plenty for every realistic case I can think of. Okay, sure, it's possible to do something crazy, but does that happen often? Seems like plugin author should be notified instead of a workaround...
- 0
- 2011-09-12
- Otto
-
@Otto "non spesso"e "mai" sono cose diverse.Se riesco a creare unplug-in da questo,hointenzione di aggiungere un avviso ancheper la lunghezza della chiave.Tuttavia,non vedo unpuntonelmantenerei dati spazzaturanel database soloperchéi transitorifunzionanoin questomodo.Potrebbenonessere unbug,manon è certo una caratteristica.@Otto "not often" and "never" are different things. If I get to making plugin out of this I plan to add warning for key length as well. However I do not see a point in keeping garbage data in database just because transient work that way. It may not be a bug, but it is hardly a feature.
- 0
- 2011-09-12
- Rarst
-
Ilmiopuntonon ètenerlinel database soloperchéfunzionanoin questomodo.Ilpunto è cheprovare a "raccoglierei rifiuti" costapiù di quanto si risparmia,praticamentein tuttii casi.In realtà è controproducente.My point isn't to keep them in the database just because they work that way. My point is that trying to "garbage collect" them costs more than it saves, in virtually all cases. It's actually counterproductive.
- 0
- 2011-09-12
- Otto
-
Ticket Trac correlato: http://core.trac.wordpress.org/ticket/20316Related trac ticket: http://core.trac.wordpress.org/ticket/20316
- 1
- 2013-09-29
- Stephen Harris
-
3 risposta
- voti
-
- 2011-01-10
Adesso lo sono
Apartire da WordPress 3.7,i transienti scaduti vengonoeliminati durantegli aggiornamenti del database,vedere # 20316
Vecchia risposta
Se qualcunononpuòmostrarmiil contrario,sembra chei transientinon siano,dopotutto,garbage collection. Ciò che lo rendepeggiore è che,a differenza delle opzioni,non ègarantito che siano archiviatenel database. Quindinonesiste unmodo affidabileper recuperare l'elenco dituttii transitoriper verificarne la scadenza.
Unpo 'di codiceimprovvisatopereseguire lagarbage collection seil database viene utilizzatoper lamemorizzazione:
add_action( 'wp_scheduled_delete', 'delete_expired_db_transients' ); function delete_expired_db_transients() { global $wpdb, $_wp_using_ext_object_cache; if( $_wp_using_ext_object_cache ) return; $time = isset ( $_SERVER['REQUEST_TIME'] ) ? (int)$_SERVER['REQUEST_TIME'] : time() ; $expired = $wpdb->get_col( "SELECT option_name FROM {$wpdb->options} WHERE option_name LIKE '_transient_timeout%' AND option_value < {$time};" ); foreach( $expired as $transient ) { $key = str_replace('_transient_timeout_', '', $transient); delete_transient($key); } }
They now are
Starting with WordPress 3.7 expired transients are deleted on database upgrades, see #20316
Old answer
If someone can't show me otherwise it seems that transients are not garbage collected after all. What makes it worse is that unlike options they are not guaranteed to be stored in database. So there is no reliable way to fetch list of all transients to check them for expiration.
Some makeshift code to do garbage collection if database is used for storage:
add_action( 'wp_scheduled_delete', 'delete_expired_db_transients' ); function delete_expired_db_transients() { global $wpdb, $_wp_using_ext_object_cache; if( $_wp_using_ext_object_cache ) return; $time = isset ( $_SERVER['REQUEST_TIME'] ) ? (int)$_SERVER['REQUEST_TIME'] : time() ; $expired = $wpdb->get_col( "SELECT option_name FROM {$wpdb->options} WHERE option_name LIKE '_transient_timeout%' AND option_value < {$time};" ); foreach( $expired as $transient ) { $key = str_replace('_transient_timeout_', '', $transient); delete_transient($key); } }
-
$time=$ _SERVER ["REQUEST_TIME"];epoifacendo uso di $time nella query SQL -nonfarlo.Gestiscipiù attentamente le variabili/i valori $ _SERVERperprevenire leiniezioni SQL.$time = $_SERVER['REQUEST_TIME']; and then making use of $time in the SQL query - don't do that. Deal more carefully with $_SERVER variables / values to prevent SQL injections.
- 0
- 2011-01-10
- hakre
-
@hakre hm ... L'ho scelto dallapresentazione sulleprestazioni di PHP che consigliava di utilizzare `time ()` chepuò causarebug (l'esecuzionenon èistantaneapernatura).Iltempo di richiesta vieneimpostato da PHP stesso,nonproviene da alcuntipo di datiforniti dall'utente.Perché questa vulnerabilità?@hakre hm... I picked that from presentation on PHP performance that recommended it over using `time()` which can cause bugs (execution is not instant by nature). Request time is being set by PHP itself, doesn't come from any kind of user-supplied data. Why is this vulnerability?
- 0
- 2011-01-10
- Rarst
-
@Rarst:non ho detto chenon dovresti usarlo,dovresti solo assicurarti che sia codificatoin modo sicuroperessere utilizzato all'interno della query SQL.Dovrestifarlo con ogni variabile da unafonteesterna.Le variabili $ _SERVERpotrebberononessereimpostate comeprevistoe,invece,impostate anche dall'utente richiedente.Volevo solopropagare alcunebuonepratiche di codifica.Come sempre,per conoscereil reale stato di disponibilità,consultare la documentazione.Per PHP 4,adesempio,tale variabilenonesistee potrebbeessere sovrascritta da un'intestazionepersonalizzata o da una variabile di ambiente - http://php.net/manual/en/reserved.variables.server.php@Rarst: I didn't say that you should not use it, you should just ensure that it is safely encoded to be used inside the SQL query. You should do this with every variable from an external source. $_SERVER variables might not be set as expected, and instead, set by the requesting user even. I only wanted to propagate some good coding practice. As always, to learn about the real state of availability, see the docs. For PHP 4 for example, such a variable does not exists and might be overwritten by a custom header or environment variable - http://php.net/manual/en/reserved.variables.server.php
- 0
- 2011-01-10
- hakre
-
@hakre risolto (credo),grazieperilpromemoria PHP4btw (non vedo l'ora che WordPressinterrompail supporto)@hakre fixed (I think), thanks for PHP4 reminder btw (I can't wait for WordPress to drop support of it)
- 0
- 2011-01-10
- Rarst
-
Sembramoltomeglio aimiei occhi;).Speriamo chenon ci sianoproblemi contime ()e interinegativi chepotrebbero cancellaretutti onessuntransitorio senonper sbaglio.Nonfidartimai di un sistemain esecuzione: PThat looks much better in my eyes ;). Let's hope that there is no problem with time() and negative integers that might delete all or no transients than by accident. Never trust a running system :P
- 0
- 2011-01-10
- hakre
-
Nel casoin cuinonfossi a conoscenza,_ è un caratterejolly singoloper leistruzioni LIKEe dovrebbeidealmenteessere sottoposto aescape.:)In case you weren't aware, _ is a single char wildcard for LIKE statements, and should ideally be escaped. :)
- 0
- 2011-01-10
- Denis de Bernardy
-
@ Denis sì,lo so ... Manessuna differenzapraticain questa query? .. Ameno che qualcunonon riesca anominare l'opzione XtransientXtimeoutX o qualcosa delgenere.@Denis yeah, I know that... But no practical difference in this query?.. Unless someone manages to name option XtransientXtimeoutX or something.
- 0
- 2011-01-10
- Rarst
-
Non useresti $ wpdb->prepare ()perproteggerti adeguatamente da dati contaminati come quello di cuiparlava @hakre?Questo risolverebbe anche l'escape di "_".Consiglierei di usarlo,comebestpractice.Wouldn't you use $wpdb->prepare() in order to properly protect yourself from tainted data such as what @hakre was talking about? This would also solve the escaping of the '_' as well. I'd recommend using it, as a best practice.
- 0
- 2012-06-22
- Tom Auger
-
@ Tom diverso da "peressere veramente veramente sicuro" questa specifica querynon ha davverobisogno diesserepreparatae nonmi sonopreoccupato di aggiungerla.@Tom other than "to be really really sure" this specific query doesn't really need prepare and I didn't bother to add it.
- 0
- 2012-06-22
- Rarst
-
Hai ragione ora che loguardo.(Int)probabilmente ètutta laprotezione di cui haibisogno su quella variabile del server.You're right now that I look at it. The (int) probably is all the protection you need on that server variable.
- 0
- 2012-06-22
- Tom Auger
-
Non dovrebbeessere "_transient_timeout_%"?Soloper assicurarti che sia davvero ciò che WP usa comeprefisso?;)Shouldn't it be `_transient_timeout_%`? Just to make sure it really is what WP uses as prefix? ;)
- 0
- 2013-07-28
- kaiser
-
- 2011-09-12
Spostare alcuni commenti dalla discussionein una risposta,con riformulazionee riformattazione ..
Fondamentalmente,il risultato è che,ameno chetunon abbia un casoestremamenteestremo,non hanno davverobisogno diessere "raccolti dalla spazzatura". Senon li recuperimai,nonimporta se sonopresenti omeno.
Vedi,i transienti sonomemorizzatinellatabella delle opzioniperimpostazionepredefinita. In un'installazione dibase,latabella delle opzioni conterràforse 100 voci. Ognitransiente aggiunge altre due voci,ma anche sene haimigliaia,noninfluiscono sulla velocità del sito,poichénon vengono caricate automaticamente.
All'avvio,WordPress carica le opzioniin memoria,ma carica solo le opzioni che hannoilflag di caricamento automatico attivato. Itransientinon lo capiscono,quindinon vengono caricatiin memoria. Soloi transitori che vengonoeffettivamente utilizzatiin seguito avranno un costo.
Dalpunto di vista del database,latabella delle opzioni haindici sia sull'ID dell'opzione che sulnome dell'opzione. Itransitori vengono sempre caricatiin base alnome (chiave),quindi le loro ricerche sono sempre semplici selezioni su un singolo valore di chiave univoco. Quindi la ricerca è O (log (n))ed è super veloce. Con un Big-O di log (n),dovrestientrarein milionie milioni di righeprima che diventievidente. Francamente,il sovraccarico di configurazionee smontaggio della query,insieme all'effettivotrasferimento dei dati,èmoltopiù lungo. La query stessa vieneeseguitaessenzialmentein tempo zeroper confronto. Quindiil semplice avere righeinutilizzateextranoninfluisce sunient'altro che sull'utilizzo di spazio su disco aggiuntivo.
L'indicizzazionenei database è uno di queitipi diidee di lettura approfondita chenon ha sensoper lepersone chenon hannoeffettivamente capito cosa sta succedendo dietro le quinte. I database sonoprogettatiper un rapido recupero dei dati,da zero,e possonogestire questogenere di cose senzaproblemi. Questa è una lettura abbastanzabuona: http://en.wikipedia.org/wiki/Index_(database )
Ora,lapulizianelmodopiù ovvio (chiamando SQL DELETE su diessi)in realtànon lielimina dal database. Li rimuove dall'indicee contrassegna la riga come "cancellata". Dinuovo,èproprio così chefunzionanoi database. Per liberareeffettivamente lo spazio su disco,devi quindi continuaree fare successivamente una TABELLA OTTIMIZZATA,e questanon è un'operazione veloce. Richiedetempo. Probabilmentepiùtempo di quantone valga lapena. Probabilmentenon è sufficienteperfarti risparmiaretempo della CPU,in totale.
Se hai un caso che causa un continuoinserimento dinuovitransitori chenon vengono utilizzati,deviinvecetrovareilproblema sottostante. Cosa stainserendo questitransitori? Usano una chiave che cambia omuta? Intal caso,ilplug-in oil codice che causa ciò dovrebbeessere corretto,in pratica,nonfarlo. Ciò saràpiù utile,perché èprobabile che ancheil codice chenon li crea correttamentenon li recuperie quindi svolgapiù lavoro di quello che devefare.
D'altraparte,potrebbeesserci un casoin cui vengono creatitransitoriper qualcosa come ognipost. Questopuò davveroessereperfettamente accettabile. Lofaccioio stessoin SFC,permemorizzarei commentiin arrivo da Facebook. A ognipost è associato unpotenzialetransitorio,il che significa due righeextraperpost. Se hai 10.000post,avrai 20.000 righenellatabella delle opzioni (eventualmente). Questonon èmale o lento,perché ancora una volta,c'èpochissima differenzatra 100 righee 20.000 righeper quanto riguardai database. Ètuttoindicizzato. È veloce come diamine. Sotto-sotto-millisecondi.
Quandoinizi aentrarein milioni di righe,sareipreoccupato. Quando la dimensione dellatabella delle opzioni supera le centinaia dimegabyte,sarei abbastanzapreoccupato da dare un'occhiatapiù da vicino. Main generale,questonon è unproblematranne cheper casiestremi. Non è certo unproblemaper qualcosa dipiùpiccolo di qualcosa come ungrande sito dinotizie,con centinaia dimigliaia dipost. Eper qualsiasi sito abbastanzagrande da rappresentare unproblema,dovresti utilizzare una cache di oggettiesterna di qualchetipoe,in quel caso,i transitori vengono automaticamentememorizzati lìinvece chenel database.
Moving some of the comments from the discussion into an answer, with re-wording and re-formatting..
Basically, what it comes down to is that unless you have a super extreme case, they don't really need to be "garbage collected". If you never fetch them, then it doesn't matter if they're there or not.
See, transients are stored in the options table by default. In a base install, the options table will have maybe 100 entries in it. Each transient adds two more entries, but even if you have thousands, they don't affect the site speed, since they're not autoloaded.
On startup, WordPress loads the options into memory, but it only loads options that have their autoload flag turned on. Transients don't get this, and so don't get loaded into memory. Only transients that get actually used later will incur a cost.
From the database's perspective, the options table has indexes on both the option Id and the option name. Transients are always loaded based on the name (key), and so the lookups for them are always simple selects on a single unique key value. Thus the lookup is O(log(n)) and is super fast. With a Big-O of log(n), you'd have to get into the millions and millions of rows before it became noticable. Frankly, the overhead in the setup and teardown of the query, along with the actual data transfer, is way longer. The query itself runs in essentially zero-time by comparison. So simply having extra unused rows doesn't affect anything but using extra disk space.
Indexing in databases is one of those deep-read kind of ideas that doesn't make sense to people who haven't actually understood what's going on behind the scenes. Databases are designed for fast data retrieval, from the ground up, and can handle this sort of thing without issues. This is a pretty good read: http://en.wikipedia.org/wiki/Index_(database)
Now, cleanup in the most obvious way (calling SQL DELETE on them) doesn't actually delete them from the database. It just removes them from the index and marks the row as "deleted". Again, this is just how databases work. To actually clear up the disk space, you have to then continue on and do an OPTIMIZE TABLE afterwards, and this is not a fast operation. It takes time. Probably more time than it's worth. It's probably not enough to give you a savings in CPU time, in total.
If you have some case that is causing a continual insertion of new transients that are not being used, then you need to find the underlying problem instead. What is inserting these transients? Are they using a changing or mutating key? If so, then the plugin or code causing this should be fixed to, basically, not do that. That will be more helpful, because it's likely that the code that isn't creating them properly also isn't retrieving them, and thus doing more work than it has to do.
On the other hand, there may be a case where transients are being created for something like every post. This may indeed be perfectly acceptable. I do this myself in SFC, to store incoming comments from Facebook. Each post has a potential transient associated with it, which means two extra rows per post. If you have 10k posts, you'll have 20k rows in the options table (eventually). This isn't bad or slow, because again, there's very little difference between 100 rows and 20,000 rows as far as databases really care. It's all indexed. It's fast as heck. Sub-sub-milliseconds.
When you start getting into millions of rows, then I'd be worried. When the options table size increases above hundreds of megabytes, then I'd be concerned enough to take a closer look. But generally speaking, this isn't an issue except for extreme cases. It's certainly not an issue for anything smaller than something like a large news site, with hundreds of thousands of posts. And for any site large enough for it to be a problem, you should be using an external object cache of some sort, and in that case, the transients get automagically stored there instead of in the database.
-
NB:i transienti senza scadenza ** vengono ** caricati automaticamentee nessuna scadenza èil **predefinito **,quindi se un'applicazione/plugin creamoltitransitorie nonimposta una scadenza,utilizzerannoblocchi dimemoria su ognicaricamento dellapagina/delpost.NB: transients with no expiration **do** get autloaded, and no expiration is the **default**, so where an application / plugin is creating lots of transients and not setting an expiration they will be using chunks of memory on every page/post load.
- 1
- 2013-07-29
- webaware
-
Non vi è alcunmotivoper utilizzare un "transitorio senza scadenza",perché è sostanzialmenteidentico a unanormale "opzione".There is no reason to use a "transient with no expiration", because that is basically identical to a normal "option".
- 0
- 2013-07-29
- Otto
-
Certo,ma [è l'impostazionepredefinita] (http://codex.wordpress.org/Function_Reference/set_transient).Pertanto,molti autori diplug-in aggiungonotransienti senza scadenza.Sure, but [it's the default](http://codex.wordpress.org/Function_Reference/set_transient). As such, many plugin authors are adding non-expiring transients.
- 1
- 2013-07-30
- webaware
-
Inoltre,non èidentico a un'opzione,poiché verràeliminata quando si utilizza una cache degli oggetti - vedere [articolo recente su WPEngine] (http://wpengine.com/2013/02/wordpress-transient-api/)peri dettagli.Also, not identical to an option, as it will be purged when using an object cache -- see [recent article on WPEngine](http://wpengine.com/2013/02/wordpress-transient-api/) for details.
- 0
- 2013-07-30
- webaware
-
Bene,la soluzione qui è semplice:non usare queiplugin.Lo stannofacendomale.Itransitorinon devonoessere usati come sessioni,non dovresti usarli senza una scadenza significativae non dovrebbero avere chiavimutanti omodificabili.Well, the solution here is simple: Don't use those plugins. They're doing it wrong. Transients are not to be used as sessions, you should not use them without a meaningful expiration, and they should not have mutating or changing keys.
- 1
- 2013-07-30
- Otto
-
:) (perchénon èperché l'impostazionepredefinita di WordPress è sbagliata,eh?):) (because it's not because the WordPress default is wrong, eh?)
- 0
- 2013-07-31
- webaware
-
Dipende.Qualeinvece considereresti un valorepredefinito ragionevole?That depends. What would you consider a sensible default value there instead?
- 0
- 2013-07-31
- Otto
-
Dire,7giorni.Se unplugin/autore ditemi vuole qualcosa dipiùgrande opiùpiccolo,lo specificherà.Se voglionoil caricamento automatico,non dovrebbero specificare 0per la scadenza (=infinito),ma questo è ciò che hanno attualmente conilparametro di scadenza chefail doppio dovere comeparametro di caricamento automatico sì/no.In ogni caso,la scadenzapredefinitanon dovrebbeportare anche a autoload=yes comeimpostazionepredefinita;sta solo chiedendoguai.Say, 7 days. If a plugin / theme author wants something bigger or smaller, they'll specify it. If they want autoload, they shouldn't have to specify 0 for expiration (= infinity), but that's what they've currently got with the expiration parameter doing double duty as the yes/no autoload parameter. Either way, default expiration shouldn't also lead to autoload=yes as default; that's just asking for trouble.
- 2
- 2013-08-01
- webaware
-
Amioparere,non specificare una scadenza dovrebbegenerare unerrorefatalee danneggiareil sito.Mapoinon sono responsabile.Untransitorio senza scadenza è stupidoe privo di significato.Se vuoi usare la cache degli oggetti,usa semplicemente la cache degli oggetti direttamente con lefunzioni wp_cache.Detto questo,ci sonobigliettiper avere una versionefutura di WordPress che ripuliscai vecchitransitori,principalmenteperché è "sgradevole"più di ogni altra cosa.In my considered opinion, not specifying an expiration should throw a fatal error and break the site. But then I'm not in charge. A transient with no expiration is stupid and meaningless. If you want to use the object cache, then just use the object cache directly with the wp_cache functions. That said, there are tickets to have future version of WordPress clean up old transients, mainly because it's "unsightly" more than anything else.
- 1
- 2014-03-19
- Otto
-
- 2011-12-02
Otto - Nonpotreiesserepiùin disaccordo conte. Ilproblema è che allafine contutti queitransitori,la dimensione deltavolo diventa ridicola. Non ci voglionomilioni di righeperimpantanarsi. Attualmente ho a chefare con unatabella delle opzioni che ha oltre 130.000 righee siblocca regolarmente. Poichéil campo del valore è untipo ditesto digrandi dimensioni,anche cercare solo le righe di "caricamento automatico" diventa unincuboper leprestazioni. Questi campi valore vengonomemorizzati separatamente dal resto dei dati della riga. Anche se logicamentefaparte della stessatabella,i join devono avvenireperestrarre le righe desiderate. Join che ora richiedono un'eternitàperchéi dati di cui haibisogno sono distribuiti ovunque sul disco. La creazione diprofili (utilizzandojet profilerpermysql) lo ha dimostrato.
L'aggiunta del caricamento automatico alla chiave clusterpotrebbe aiutare a risolvere questoproblema. Il clustering su Autoload Desc,adesempio ID ASC,consentirebbe atutte le righe di caricamento automatico di raggrupparsiperprime sul disco. Anche ancorapenso chetu stiaguardando una varietàenorme da unaprospettiva DB.
Personalmentepenso cheil design di questo sistema sia stravagante. Latabella delle opzioni sembraessersitrasformatain ungenerico catch-allpermolte cose. Vabene seil campo del valore è abbastanzapiccolo daessereinclusonella stessapagina del resto dei rowdatae puòessereindicizzatoin modoefficace. Purtropponon è così. Chiunque l'abbiaprogettato devetornare alla classe DB101.
Otto - I couldn't disagree with you more. The issue is that eventually with all those transients, the size of the table becomes ridiculous. It doesn't take millions of rows to bog down. I'm currently dealing with an options table that has over 130k rows, and hangs regularly. Because the value field is a large text type, even looking for only the "autoload" rows becomes a nightmare of performance. Those value fields are stored separately from the rest of the row data. Even though it's logically part of the same table, joins must happen in order to pull up the rows you want. Joins that now take forever because the data you need is spread all over the place on disk. Profiling (using jet profiler for mysql) has proven this.
Adding auto-load to the clustered key might help solve this problem. Clustering on Autoload Desc, ID ASC for example, would allow all the autoload rows to bunch together first on disk. Even still I think you're looking at a huge strain from a DB perspective.
Personally I think the design of this system is wack. The options table seems to have turned into a general catch-all for a lot of things. That's fine if the value field is small enough to be included on the same page as the rest of the rowdata, and can be indexed effectively. Unfortunately that's not the case. Whoever designed this needs to go back to DB101 class.
-
vero,ma considera che quando èiniziato lo sviluppo di WordPress,nessunopensava che sarebbe arrivato ad averemigliaia diplugin utilizzando latabella delle opzioni come archiviazione dei dati :)true, but consider that when WordPress development started, nobody thought that it would reach to have thousands of plugins using options table as their data storage :)
- 5
- 2011-12-02
- onetrickpony
-
@onetrickponyeccoperché èimportanteprenderti sempreiltuotempoe fare le coseperbene,cheti aspetti che ungiorno siaenorme ono :)@onetrickpony that's why it's important to always take your time and do things right, whether you expect it to be huge someday or not :)
- 0
- 2017-12-11
- Mahmoud Al-Qudsi
Questa domandami hafattopensare a feed RSStemporaneiinwp_optionsnon viene rimosso automaticamente?
Itransitori dovrebbero scaderee essereeliminati.Tuttavia l'unicomodoin cui vedo che questo ègestito è quandoiltransitorio è scadutoe richiesto,quindi vieneeliminato durante la richiesta.
Cosa succede seiltransitorio è scadutomanon vienemai richiesto dopo?Dalla descrizionenel Codex hopensato chefosseimplicita una sorta di raccolta dei rifiuti.Oranonne sono così sicuroe non riesco atrovare alcun codice chefunzioni così.
Quindi rimarràbloccatoper semprenel database?