<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Alex Medina &#187; php memoria allowed memory exhausted</title>
	<atom:link href="http://alexmedina.net/blog/tag/php-memoria-allowed-memory-exhausted/feed/" rel="self" type="application/rss+xml" />
	<link>http://alexmedina.net/blog</link>
	<description>Mi blog, mis cosas...</description>
	<lastBuildDate>Tue, 22 Jun 2010 08:23:03 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Ojo con la memoria en PHP</title>
		<link>http://alexmedina.net/blog/2007/11/26/ojo-con-la-memoria-en-php/</link>
		<comments>http://alexmedina.net/blog/2007/11/26/ojo-con-la-memoria-en-php/#comments</comments>
		<pubDate>Mon, 26 Nov 2007 15:24:57 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[php memoria allowed memory exhausted]]></category>

		<guid isPermaLink="false">http://alexmedina.net/blog/?p=13</guid>
		<description><![CDATA[Erase una vez un programador web realizando un script relativamente complicado… Lo prueba en su maquina, funciona de maravilla. Lo sube al servidor de producciÃ³n.
Craaash. Y ni siquiera un rastro de error. Revisa que los errores estÃ¡n habilitados, revisa los logs, y nada. Busca algÃºn rastro y nada….
Mis poderes de psÃ­quico me dicen que es [...]]]></description>
			<content:encoded><![CDATA[<p>Erase una vez un programador web realizando un script relativamente complicado… Lo prueba en su maquina, funciona de maravilla. Lo sube al servidor de producciÃ³n.</p>
<p>Craaash. Y ni siquiera un rastro de error. Revisa que los errores estÃ¡n habilitados, revisa los logs, y nada. Busca algÃºn rastro y nada….</p>
<p>Mis poderes de psÃ­quico me dicen que es un error de memoria.</p>
<p>Usualmente, PHP captura esos errores y nos lanza el ya tÃ­pico error “<strong>Allowed memory size of x bytes exhausted</strong>”. Esto es debido a que por precauciÃ³n contra malos programadores, y especialmente en servidores compartidos, es posible limitar la memoria ocupada por cada script.<br />
Para lidiar con estos problemas, he aquÃ­ unos tips bÃ¡sicos que harÃ¡n tu experiencia un poco menos difÃ­cil.</p>
<ol>
<li><strong>Revisa el uso de memoria de tus scripts<br />
</strong>La funciÃ³n <a href="http://mx.php.net/manual/en/function.memory-get-usage.php" onclick="javascript:urchinTracker ('/outbound/article/mx.php.net');"><strong class="methodname">memory_get_usage</strong></a><span class="methodname"> te regresa el numero de bytes que tu script esta ocupando. Sin embargo esta funciÃ³n no esta disponible en todos los sistemas, ya que hay que compilar php con el parametro </span>–enable-memory-limit. Si en tu servidor no existe esta funciÃ³n puedes emularla de la siguiente manera.<code>if( !function_exists('memory_get_usage') ){<br />
function memory_get_usage() {<br />
exec(”ps -orss -p “.getmypid(), $output);<br />
return $output[1];<br />
}<br />
}<br />
</code>Es similar a la incluida en php, aunque no es tan exacta, pero te puedes dar una buena idea de lo que esta sucediendo. Requiere privilegios de ejecuciÃ³n, ya que utiliza el comando ps.</li>
<li><strong>Cuando termines, no te olvides de limpiar<br />
</strong>Si ya no utilizas una variable que contenga una fuerte cantidad de memoria, destrÃºyela con unset($variable). Esto liberara inmediatamente la memoria ocupada.</li>
<li><strong>DÃ­ no a las globales<br />
</strong>Esta es una extensiÃ³n de la anterior. Ten cuidado al usar variables globales. Cuando usas unset en una variable global adentro de una funciÃ³n solamente se destruye la variable local, no la global. AsÃ­ que una razÃ³n mas para NO usar variables globales. (como si hicieran falta <img src="http://www.masio.com.mx/masio/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /> )</li>
<li><strong>No confies en el barrendero<br />
</strong>En general he notado que al finalizar una funciÃ³n, esta desactiva las variables locales. Sin embargo, no siempre es el caso o bien no se libera la memoria que estas variables usaron, por lo que cuando uses variables pesadas dentro de una funciÃ³n, desactivalas con unset antes de terminar el script si ya no haces uso de ellas.</li>
<li><strong>Olvida tan pronto como puedas<br />
</strong>Si vas a utilizar por ejemplo, un archivo de muchas lineas, evita mantenerlo en memoria. Esto ultimo es lo mas facil pero puede provocar errores a la larga. En su lugar ve procesando el archivo linea por linea y escribe el resultado en un archivo. <a href="http://mx.php.net/tmpfile" onclick="javascript:urchinTracker ('/outbound/article/mx.php.net');">tmpfile</a> y las funciones <a href="http://mx.php.net/fopen" onclick="javascript:urchinTracker ('/outbound/article/mx.php.net');">fopen</a>, <a href="http://mx.php.net/fclose" onclick="javascript:urchinTracker ('/outbound/article/mx.php.net');">fclose</a> y similares son tus amigos. Este consejo es el que mas te va a salvar la vida en estos casos, crÃ©eme.</li>
<li><strong>No ignores los avisos</strong>Como recomendaciÃ³n general, cuando estÃ©s debuggeando scripts utiliza error_reporting con E_STRICT. Esto te darÃ¡ un poco mas de informaciÃ³n que E_ALL, aunque con el tiempo y conforme vayas mejorando tus habilidades no notaras la diferencia.</li>
<li><strong>Fuerza bruta<br />
</strong>Como ultimo recurso, si nada de lo anterior funciona (que no he encontrado caso en que no funcione) es posible aumentar la memoria disponible para tu script, mediante la directiva <a href="http://mx.php.net/ini_set" onclick="javascript:urchinTracker ('/outbound/article/mx.php.net');">ini_set</a>(”memory_limit”, “16M”) la cual elevarÃ­a a 16 MB la capacidad de tu script. Esta directiva esta disponible en cualquier servidor que permita la ejecuciÃ³n de la funcion ini_set. Aunque se cuidadoso, especialmente si tienes un servidor compartido, se buen vecino y no acabes con el servidor.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://alexmedina.net/blog/2007/11/26/ojo-con-la-memoria-en-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
