<?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>Sistemas | ahierro.es</title>
	<atom:link href="https://blog.ahierro.es/category/sistemas/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.ahierro.es</link>
	<description>Un blog personal  donde compartir experiencias e inquietudes relacionadas con internet, tecnología y otros asuntos interesantes</description>
	<lastBuildDate>Thu, 07 Oct 2021 07:02:51 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.1</generator>

<image>
	<url>https://blog.ahierro.es/wp-content/uploads/2018/10/cropped-logo_small-1-2-32x32.png</url>
	<title>Sistemas | ahierro.es</title>
	<link>https://blog.ahierro.es</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Variables de configuración de PHP en .htaccess</title>
		<link>https://blog.ahierro.es/variables-de-configuracion-de-php-en-htaccess/</link>
					<comments>https://blog.ahierro.es/variables-de-configuracion-de-php-en-htaccess/#respond</comments>
		
		<dc:creator><![CDATA[Andres]]></dc:creator>
		<pubDate>Thu, 07 Oct 2021 07:02:49 +0000</pubDate>
				<category><![CDATA[Apache 2]]></category>
		<category><![CDATA[Sistemas]]></category>
		<category><![CDATA[Tips & Quick Wins]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[htaccess]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[servidor]]></category>
		<guid isPermaLink="false">https://blog.ahierro.es/?p=2352</guid>

					<description><![CDATA[<p>No siempre disponemos de acceso a la configuración del servidor. Aprendemos a configurar las variables de PHP mediante el archivo .htaccess cuando esto ocurre</p>
La entrada <a href="https://blog.ahierro.es/variables-de-configuracion-de-php-en-htaccess/">Variables de configuración de PHP en .htaccess</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></description>
										<content:encoded><![CDATA[<p>Al momento de desplegar nuestras aplicaciones web no siempre tenemos acceso a la configuración del servidor. Aprendemos a configurar las variables de PHP mediante el archivo .htaccess cuando esto ocurre.</p>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="576" src="https://blog.ahierro.es/wp-content/uploads/2021/10/htaccess-1024x576.png" alt="Variables de PHP en htaccess" class="wp-image-2388" srcset="https://blog.ahierro.es/wp-content/uploads/2021/10/htaccess-1024x576.png 1024w, https://blog.ahierro.es/wp-content/uploads/2021/10/htaccess-300x169.png 300w, https://blog.ahierro.es/wp-content/uploads/2021/10/htaccess-768x432.png 768w, https://blog.ahierro.es/wp-content/uploads/2021/10/htaccess-1536x864.png 1536w, https://blog.ahierro.es/wp-content/uploads/2021/10/htaccess.png 1920w" sizes="(max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px" /></figure>



<span id="more-2352"></span>



<p>Y es que a veces encontraremos que nuestra aplicación tiene unos requisitos mínimos que el servidor no cumple. Pongamos por ejemplo que queremos <a href="https://blog.ahierro.es/instalar-prestashop-1-7/" title="Instalar Prestashop 1.7">instalar prestashop</a> que tiene ciertos <a href="https://blog.ahierro.es/requisitos-minimos-de-prestashop-1-7/" title="Requisitos mínimos de Prestashop 1.7">requisitos mínimos</a> y que por algún motivo nuestro hosting no satisface.</p>



<h2 class="wp-block-heading">Cómo configurar variables de PHP desde .htaccess</h2>



<p>Hay varias formas de actuar sobre estas variables, pero tal y como reza el título de esta entrada hoy vamos a hacerlo con el archivo <em>.htaccess</em>, y para ello utilizaremos la orden <em>php_value</em>. Su sintaxis es muy sencilla<em>:</em></p>



<p><em>php_value</em> + <em>variable_php</em> + <em>valor</em>. </p>



<p>Un ejemplo podría ser que necesitamos que la variable <em>memory_limit</em> esté configurada en 64M y el servidor la tiene configurada en 32M, o quizás el <em>max_input_vars</em> está configurado en 500 y nuestros requisitos mínimos son 1.000. Para ello incluiríamos las siguientes líneas en el archivo .htaccess:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
php_value memory_limit 64M
php_value max_input_vars 1000
</pre></div>


<p>O supongamos que queremos mostrar los errores de PHP de nuestra aplicación. Podemos hacerlo desde el archivo .htaccess:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
php_value error_reporting 7
php_flag display_errors On
</pre></div>


<h2 class="wp-block-heading">Dónde colocar las líneas dentro del archivo .htaccess</h2>



<p>Personalmente me gusta colocar este tipo de sentencias al comienzo del archivo .htaccess, justo detrás de los comentarios:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
# Comentarios habituales en archivos .htaccess

# variables php
php_value error_reporting 7
php_flag display_errors On

&amp;lt;IfModule mod_rewrite.c&gt;
&amp;lt;IfModule mod_env.c&gt;
SetEnv HTTP_MOD_REWRITE On
&amp;lt;/IfModule&gt;

RewriteEngine on
...
</pre></div>


<h2 class="wp-block-heading">Créditos, referencias y artículos relacionados</h2>



<ul class="wp-block-list"><li><a href="https://blog.ahierro.es/aumentar-el-limite-de-memoria-de-un-script-en-php/">Aumentar el límite de memoria de un script en PHP</a></li><li><a href="https://blog.ahierro.es/aumentar-el-limite-de-tiempo-maximo-de-ejecucion-de-un-script-en-php/">Aumentar el limite de tiempo máximo de ejecución de un script en PHP</a></li><li><a href="https://blog.ahierro.es/servidor-web-en-raspberry-pi-y-ubuntu-mate/">Servidor Web en Raspberry PI y Ubuntu Mate</a></li><li><a href="https://blog.ahierro.es/como-configurar-virtual-hosts-en-apache-y-ubuntu/">Como configurar Virtual Hosts en Apache 2 y Ubuntu</a></li><li><a href="https://blog.ahierro.es/habilitar-modulos-en-apache-2-sobre-ubuntu/">Habilitar módulos en Apache 2 sobre Ubuntu</a></li></ul>La entrada <a href="https://blog.ahierro.es/variables-de-configuracion-de-php-en-htaccess/">Variables de configuración de PHP en .htaccess</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.ahierro.es/variables-de-configuracion-de-php-en-htaccess/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>FTP activo vs FTP pasivo</title>
		<link>https://blog.ahierro.es/ftp-activo-vs-ftp-pasivo/</link>
					<comments>https://blog.ahierro.es/ftp-activo-vs-ftp-pasivo/#comments</comments>
		
		<dc:creator><![CDATA[Andres]]></dc:creator>
		<pubDate>Tue, 19 Nov 2019 07:02:42 +0000</pubDate>
				<category><![CDATA[Servicios]]></category>
		<category><![CDATA[Sistemas]]></category>
		<category><![CDATA[ftp]]></category>
		<category><![CDATA[ftps]]></category>
		<category><![CDATA[servidor]]></category>
		<guid isPermaLink="false">https://blog.ahierro.es/?p=2078</guid>

					<description><![CDATA[<p>El protocolo FTP lleva con nosotros desde la década de los setenta, y hoy, casi cincuenta años después, sigue siendo una tecnología muy presente en el flujo de trabajo habitual de los desarrolladores web. Personalmente lo utilzo con relativa frecuencia, generalmente con el cliente FileZilla, un cliente FTP multiplataforma de código abierto muy recomendable. Y &#8230; </p>
<p class="link-more"><a href="https://blog.ahierro.es/ftp-activo-vs-ftp-pasivo/" class="more-link">Continuar leyendo<span class="screen-reader-text"> "FTP activo vs FTP pasivo"</span></a></p>
La entrada <a href="https://blog.ahierro.es/ftp-activo-vs-ftp-pasivo/">FTP activo vs FTP pasivo</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></description>
										<content:encoded><![CDATA[<p>El protocolo FTP lleva con nosotros desde la década de los setenta, y hoy, casi cincuenta años después, sigue siendo una tecnología muy presente en el flujo de trabajo habitual de los desarrolladores web.</p>



<figure class="wp-block-image is-resized"><img decoding="async" src="https://lh3.googleusercontent.com/yRgL9935kWlYQIhJf0mXw_oaa6ulwsW9mbw2OWCo-QhDz2vE35Kqk1ZbjI9XiTU9T1wKhKKxCe3svz5S72pD9x5aFEjLxzGtLkD-00w4WLbB5wwqsJ--u_nrJI6DPuQlKHeQ7SDHmkW97ukFSNTdlWH-z43BzJJ0H51hasNjJkGvf3aDzz0cht-F78bk8TqGIYCYA_25bHZ0cGpk6fY2ZKXrTvPgklJ58JXibyWI2AtgDUz0A8RMmTtz3yFxJw0PWsgayACnamN032kXlb9yE8Y8APsNpmk5racVLM_EwsjceRCN0O9xperEORykp5IYUMaAdjb8VNGzHLjPvhuYo7JVsujGLhaN__eJxWH2TtwIXuu91K9KDmXMvigZKjTR6cmrtwaZ-wTrIXUBS1wAfo3c_sQ7QWwKEHLmSOwaYTwSC3jWRkHU8HlVbS3eNcjLvgEWwJ70F-H2Ti0KLJKo4ySqSPrOrG02v2gNJHrUaN46p6p6BNLgUIrOzHSUonfoOHY0j2YtojI8baFqt74LFyu4LuwC8lj-XpDIud2CLRBkGmBxi2zP3NyObUplJiwRbl7BnojmhpbqrPjAKpwY-rCatqymzedjgzpvCh9a5ADFKqQDM4-Vl8qMLEZ_iBrNBOPiJr8emKN_FXEM_HIOCKKA1dnb8rDf75_hRmm-c0D9e-0RDsl90V5crdwSkDmPWFwZ5SvO7xpQqusK8BzaG9CsvnXkYd0qiyN7n_7qhPo=w1622-h912-no" alt="FTP activo vs FTP pasivo" width="840" height="470"/></figure>



<span id="more-2078"></span>



<p>Personalmente lo utilzo con relativa frecuencia, generalmente con el cliente FileZilla, un cliente FTP multiplataforma de código abierto muy recomendable. Y siendo honestos, hasta la escritura de esta entrada, mi desconocimiento sobre los modos de conexión activo o pasivo era absoluto, algo que intuyo que le sucede a mucha gente, y ya se sabe que mal de muchos <s>consuelo de tontos</s> entrada en el blog.</p>



<h2 class="wp-block-heading">FTP, FTPS y SFTP.</h2>



<p>Recordemos que existen tres protocolos distintos a los que solemos referirnos cuando hablamos de FTP: FTP, FTPS y SFTP. Si tienes dudas sobre alguno de ellos puedes echarle un vistazo a la entrada <a href="https://blog.ahierro.es/ftp-ftps-y-sftp-diferencias-ventajas-inconvenientes/">FTP, FTPS y SFTP: diferencias, ventajas e inconvenientes</a>.</p>



<p>Pues bien, los modos activo o pasivo solo aplican sobre los protocolos FTP y FTPS, en ningún caso sobre SFTP, pues es un protocolo que dista bastante de los dos anteriores.</p>



<h2 class="wp-block-heading">Puerto de datos y puerto de control</h2>



<p>Otro aspecto clave que debemos conoce para entender el funcionamiento del FTP es que trabaja sobre dos puertos distintos: el puerto de datos y el puerto de comandos o puerto de control.</p>



<p>Los nombres son bastante auto-explicativos, el  puerto de datos se encarga de la transmisión de los ficheros y el puerto de control de las instrucciones entre ambos host. Se diseñó así para poder enviar comandos sin la necesidad de detener la transmisión de datos ni de encolarlos tras estos.</p>



<p>Si nos centramos en el servidor, tradicionalmente el puerto de control ha sido el 21 y el puerto de datos varía en función del modo, siendo el 20 para el modo activo, y un puerto aleatorio para el modo pasivo.</p>





<p>En el lado del cliente, en cambio, el puerto de control será un puerto aleatorio P superior a 1023, y el puerto de datos será P+1. Esto es así tanto en el modo activo, como en el pasivo.</p>



<p>Pero veamos cada uno de los modos en detalle para entenderlo mejor.</p>



<h2 class="wp-block-heading">FTP activo</h2>



<p>Es el modo predeterminado para las conexiones FTP, de hecho fue el primero en desarrollarse. En este modo el servidor utilizará el puerto 20 para la transferencia de datos, mientras que transmitirá los comandos utilizando el puerto 21. El cliente en cambio utilizará un puerto aleatorio P superior al 1023 para la transferencia de comandos, y un puerto P+1 para la transferencia de datos.</p>



<h3 class="wp-block-heading">Secuencia de conexión del modo activo</h3>



<p>La secuencia de conexión del modo activo es la siguiente:</p>



<ol class="wp-block-list"><li>El cliente FTP comienza la conexión dese un puerto de control aleatorio P con destino al puerto 21 del servidor. Como hemos mencionado el puerto P será superior a 1023.</li><li>El servidor responde desde el puerto de control.</li><li>El servidor inicia entonces la conexión del canal de datos: puerto 20 para el servidor y puerto P+1 para el cliente.</li><li>El cliente responde desde el puerto de datos estableciendo así la conexión.</li></ol>



<h3 class="wp-block-heading">Inconvenientes del modo activo</h3>



<p>Históricamente el principal inconveniente de este modo ha radicado en que si no hay una directiva específica en los firewalls del lado del cliente, la conexión es propensa a ser bloqueada. Esto se debe a que, como hemos visto, existen dos conexiones independientes: una de salida en la que el cliente establece la conexión del canal de control y otra de entrada en la que el servidor hace lo propio con el de datos. Esta última conexión es iniciada por el servidor en el puerto previamente negociado, y en ocasiones es bloqueada por el firewall del cliente al ser identificada como un intento de conexión externa no autorizada.</p>



<p>Recordemos que este sistema se diseñó en los años 70, cuando la democratización de los sistemas informáticos y los problemas de seguridad eran completamente distintos a los que podemos encontrar hoy en día.</p>



<p>Sea como sea, en todos los años que llevo utilizando el protocolo FTP desde el rol de cliente, no recuerdo haber experimentado nunca problemas de este tipo, y habré conectado con varias decenas de servidores de muchos proveedores distintos. Entiendo que esto se deba a la sofisticación de los sistemas de red y de seguridad más modernos.</p>



<h2 class="wp-block-heading">FTP pasivo</h2>



<p>El modo de FTP pasivo surge como consecuencia de los problemas de conexión  del modo activo. Este modo mantiene los dos canales (control y datos) pero en este caso es el cliente el encargado de establecer las dos conexiones.</p>



<p>El servidor sigue manteniendo el puerto 21 como puerto de comandos, el puerto de datos en cambio difiere del modo activo y pasa a ser un rango de puertos Q superior a 1023. Del lado del cliente seguimos manteniendo el puerto P superior a 1023 para control, y el puerto P+1 para datos.</p>



<h3 class="wp-block-heading">Secuencia de conexión del modo pasivo</h3>



<p>La secuencia de conexión del modo pasivo es la que sigue a continuación:</p>



<ol class="wp-block-list"><li>El cliente FTP comienza la conexión dese un puerto de control aleatorio P con destino al puerto 21 del servidor.</li><li>El servidor responde desde el puerto de control.</li><li>El cliente inicia la conexión del canal de datos dese el puerto P+1 hacia el puerto Q del servidor.</li><li>El servidor responde desde el puerto de datos estableciendo así la conexión.</li></ol>



<p>Como ves, los pasos uno y dos son iguales que en el modo activo, y es en los pasos tres y cuatro dónde vemos como se invierten los roles y es el cliente el que inicia la conexión de datos.</p>



<h3 class="wp-block-heading">Inconvenientes del modo pasivo del FTP</h3>



<p>El principal inconveniente de habilitar el modo pasivo en un servidor FTP está asociado con el riesgo extra en materia de seguridad que conlleva la apertura de un rango de puertos extra con respecto al modo activo. Notemos que para que el modo pasivo funcione adecuadamente estos puertos deben ser abiertos tanto en el servidor como en el firewall.</p>





<p>Para minimizar este riesgo la estrategia pasa por definir un rango de puertos lo más pequeño posible en función del número de conexiones concurrentes que esperemos tener, pero ojo, porque un cliente no se corresponde con una única conexión, es muy probable que cada cliente abra múltiples conexiones concurrentes.</p>



<h2 class="wp-block-heading">Resumen</h2>



<p>Para cerrar esta entrada os dejo una tabla con el resumen de lo que hemos visto.</p>



<figure class="wp-block-table"><table class=""><tbody><tr><th></th><th></th><th>Activo</th><th>Pasivo</th></tr><tr><th>Servidor</th><th>Puerto de control</th><td>21</td><td>21</td></tr><tr><th>Servidor</th><th>Puerto de datos</th><td>20</td><td>Rango Q &gt; 1023</td></tr><tr><th>Cliente</th><th>Puerto de control</th><td>P &gt; 1023</td><td>P &gt; 1023</td></tr><tr><th>Cliente</th><th>Puerto de datos</th><td>P + 1</td><td>P + 1</td></tr><tr><th>Quien inicia</th><th>Conexión de control</th><td>Cliente</td><td>Cliente</td></tr><tr><th>Quién inicia</th><th>Conexión de datos</th><td>Servidor</td><td>Cliente</td></tr><tr><th></th><th>Inconvenientes</th><td>Bloqueo por firewalls</td><td>Riesgo extra de seguridad</td></tr></tbody></table></figure>



<h2 class="wp-block-heading">Créditos, referencias y artículos relacionados</h2>



<ul class="wp-block-list"><li>Imagen de portada por <a rel="noreferrer noopener" aria-label="Michal Jarmoluk  (abre en una nueva pestaña)" href="https://pixabay.com/users/jarmoluk-143740/" target="_blank">Michal Jarmoluk </a>en Pixabay</li><li><a href="https://blog.ahierro.es/ftp-ftps-y-sftp-diferencias-ventajas-inconvenientes/">FTP, FTPS y SFTP: diferencias, ventajas e inconvenientes</a></li><li><a href="https://blog.ahierro.es/vsftp-instalar-y-configurar-un-servidor-ftp-en-raspberry-pi-con-ubuntu/">VSFTP instalar y configurar un servidor FTP en una Raspberry Pi con Ubuntu</a></li><li><a href="https://blog.ahierro.es/ftps-o-como-habilitar-ssl-en-vsftp/">FTPS o cómo habilitar SSL en vsftp</a></li><li><a href="https://blog.ahierro.es/usuarios-virtuales-en-vsftp/">Usuarios virtuales en vsftp</a></li></ul>



<p></p>La entrada <a href="https://blog.ahierro.es/ftp-activo-vs-ftp-pasivo/">FTP activo vs FTP pasivo</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.ahierro.es/ftp-activo-vs-ftp-pasivo/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>PHP: mod_php vs CGI vs FastCGI vs FPM</title>
		<link>https://blog.ahierro.es/php-mod_php-vs-cgi-vs-fastcgi-vs-fpm/</link>
					<comments>https://blog.ahierro.es/php-mod_php-vs-cgi-vs-fastcgi-vs-fpm/#comments</comments>
		
		<dc:creator><![CDATA[Andres]]></dc:creator>
		<pubDate>Fri, 11 Oct 2019 07:07:28 +0000</pubDate>
				<category><![CDATA[Apache 2]]></category>
		<category><![CDATA[Sistemas]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[php]]></category>
		<guid isPermaLink="false">https://blog.ahierro.es/?p=1793</guid>

					<description><![CDATA[<p>Existen varias alternativas para conectar el intérprete de PHP con Apache, cada una de ellas con sus ventaja e inconvenientes. Hoy vamos repasar las principales e intentaremos responder a la pregunta de cuál es la más adecuada en función del uso que le vayamos a dar. Estoy seguro de que a muchos de vosotros os &#8230; </p>
<p class="link-more"><a href="https://blog.ahierro.es/php-mod_php-vs-cgi-vs-fastcgi-vs-fpm/" class="more-link">Continuar leyendo<span class="screen-reader-text"> "PHP: mod_php vs CGI vs FastCGI vs FPM"</span></a></p>
La entrada <a href="https://blog.ahierro.es/php-mod_php-vs-cgi-vs-fastcgi-vs-fpm/">PHP: mod_php vs CGI vs FastCGI vs FPM</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></description>
										<content:encoded><![CDATA[<p>Existen varias alternativas para conectar el intérprete de PHP con Apache, cada una de ellas con sus ventaja e inconvenientes. Hoy vamos repasar las principales e intentaremos responder a la pregunta de cuál es la más adecuada en función del uso que le vayamos a dar.</p>



<figure class="wp-block-image is-resized"><img decoding="async" src="https://blog.ahierro.es/wp-content/uploads/2019/10/alternativas_php-1024x546.jpg" alt="Alternativas Instalación PHP" class="wp-image-1803" width="840" height="448" srcset="https://blog.ahierro.es/wp-content/uploads/2019/10/alternativas_php-1024x546.jpg 1024w, https://blog.ahierro.es/wp-content/uploads/2019/10/alternativas_php-300x160.jpg 300w, https://blog.ahierro.es/wp-content/uploads/2019/10/alternativas_php-768x410.jpg 768w, https://blog.ahierro.es/wp-content/uploads/2019/10/alternativas_php.jpg 1920w" sizes="(max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px" /></figure>



<span id="more-1793"></span>



<p>Estoy seguro de que a muchos de vosotros os suena lo siguiente: te dispones a instalar un servidor web, abres la consola de Linux, instalas Apache, y cuando buscas el paquete de PHP te encuentras que tienes varias opciones: php7.2, php7.2-cgi, php7.2-fpm o libphp7.2-embed. Dudas sobre cual elegir pero no tienes tiempo o ganas de investigar, sabes que el paquete php7.2 funcionará con total seguridad, así que lo instalas y continuas con la siguiente tarea.</p>



<p>Si has vivido esta situación, no te sientas culpable, no tengas remordimientos de conciencia, no estás solo, somos muchos los que hemos actuado así, pero sigue leyendo y la próxima vez podrás elegir la mejor opción para tus necesidades.</p>



<h2 class="wp-block-heading">Handlers en Apache</h2>



<p>Según la web de Apache, un handler es «una representación interna de Apache de una acción que se va a ejecutar cuando hay una llamada a un fichero», y continua «Generalmente, los ficheros tienen handlers implícitos, basados en el tipo de fichero de que se trata». Esto, traducido al cristiano y llevado al ámbito de PHP significa que cuando Apache detecta un fichero PHP hará uso de los handlers para conectar con el intérprete y que éste realice las tares  oportunas.</p>





<h2 class="wp-block-heading">Handlers para PHP</h2>



<p>Ya sabemos que es un handler, repasemos ahora las principales opciones existente para que Apache pueda interpretar los archivos PHP.</p>



<h3 class="wp-block-heading">DSO ó mod_php</h3>



<p>Probablemente habrás escuchado hablar de mod_php pero quizás no de DSO. Mod_php es como se conoce comúnmente al manejador DSO (Dynamic Shared Object).</p>



<p>Es la opción más habitual en entornos de desarrollo o locales, si buscamos en internet como instalar PHP sobre Apache en Linux la  mayoría de resultados nos propondrán este sistema, y para muestra un  botón: <a href="https://blog.ahierro.es/servidor-web-en-raspberry-pi-y-ubuntu-mate/">Servidor Web en Raspberry PI y Ubuntu Mate</a>.</p>



<p>Con mod_php el intérprete de PHP es ejecutado directamente por Apache como un módulo, lo que evita tener que realizar llamadas a procesos externos. Esto es una ventaja en cuanto que la comunicación entre ambos es muy ágil y nos permite obtener un gran rendimiento.</p>



<p>Otra característica de este sistema es que el intérprete PHP es cargado al arrancar cada proceso de Apache, incluso cuando el contenido a servir no contiene código PHP alguno. Este hecho provoca que obtengamos un mejor rendimiento en detrimento del consumo de recursos del sistema, convirtiéndolo en una mala opción para sites con mucho tráfico.</p>



<p>También es importante destacar que PHP hereda los permisos del usuario de Apache. Esto implica que <em>nobody</em> será el propietario de cualquier archivo creado por PHP, pudiendo generar algunos conflictos de permisos. No obstante con una mínima configuración podemos evitar este problema, podéis ver como hacerlo en el artículo <a href="https://blog.ahierro.es/archivos-y-permisos-de-usuario-en-apache-y-linux/">Archivos y permisos de usuario en Apache 2 y Linux</a>.</p>



<h4 class="wp-block-heading">Ventajas de DSO</h4>



<ul class="wp-block-list"><li>Fácil instalación y configuración.</li><li>Buen rendimiento.</li></ul>



<h4 class="wp-block-heading">Inconvenientes de DSO</h4>



<ul class="wp-block-list"><li>Alto consumo de recursos.</li><li>Los archivos creados por PHP pertenecen a Apache.</li></ul>



<h3 class="wp-block-heading">CGI</h3>



<p>CGI son las siglas de Common Getway Interface. Como su propio nombre indica es una interface y su cometido es permitir a Apache interactuar con programas externos, en este caso con PHP. Es un sistema que prácticamente podemos denominar como legacy y está cada vez más en desuso debido a su pobre rendimiento y a la existencia de alternativas más modernas y eficientes.</p>



<p>Al utilizar esta interface, cada petición de PHP inicia un proceso independiente que es finalizado cuando concluye su labor. Este modus operandi consigue que CGI sea muy eficiente en el consumo de memoria pero pobre en rendimiento. En sitios web con alto tráfico el sistema de creación y destrucción de procesos implica un uso de procesador demasiado elevado, por lo que no es nada recomendable para este tipo de sites.</p>





<p>Y al igual que con DSO, Apache será el propietario de lo archivos que generemos o subamos al servidor haciendo uso de PHP, pero ya hemos visto que este problema tiene fácil solución.</p>



<h4 class="wp-block-heading">Ventajas de CGI</h4>



<ul class="wp-block-list"><li>Fácil de instalar y configurar.</li><li>Consumo de recursos moderado en sites con poco tráfico.</li></ul>



<h4 class="wp-block-heading">Inconvenientes de CGI</h4>



<ul class="wp-block-list"><li>Rendimiento pobre.</li><li>Alto consumo de procesador en sites con tráfico elevado.</li><li>Los archivos creados por PHP pertenecen a Apache.</li></ul>



<h3 class="wp-block-heading">FastCGI</h3>



<p>Podemos decir que FastCGI es la evolución de CGI, y surge por la necesidad disponer de un sistema con las ventaja de Common Getway Interface pero minimizando sus inconvenientes.</p>



<p>Al contrario que CGI, FastCGI mantiene la sesión abierta de forma persistente y no la cierra una vez que ha concluido el proceso por el que la abrió. Con esto se consigue un rendimiento similar a DSO a costa de elevar el consumo de memoria pero manteniéndolo por debajo de éste.</p>



<p>Una gran ventaja de FastCGI es que podemos configurar nuestro servidor para que trabaje con múltiples versions de PHP, lo que es particularmente útil cuando en una misma máquina tenemos aplicaciones que requieren versiones distintas de PHP.</p>



<p>Otra característica muy interesante es que podemos separar el host dónde corre Apache del host qué interpreta PHP, ofreciéndonos una gran versatilidad en el diseño de nuestro sistema.</p>



<p>Por último y haciendo referencia al propietario de los archivos creados por PHP, FastCGI hace uso de suEXEC para permitir definir la propiedad de los archivos. Esto es particularmente útil en entornos compartidos dónde es posible configurar distintos propietarios para distintos sites</p>



<h4 class="wp-block-heading">Ventajas de FastCGI</h4>



<ul class="wp-block-list"><li>Buen rendimiento.</li><li>Consumo de recursos moderado.</li><li>Posibilidad de ejecutar Apache y PHP en distintos hosts.</li><li>Posibilidad de trabajar con distintas versiones de PHP.</li><li>Posibilidad de definir el propietario de los archivos.</li></ul>



<h4 class="wp-block-heading">Inconvenientes de FastCGI</h4>



<ul class="wp-block-list"><li>Mayor complejidad de configuración.</li></ul>



<h3 class="wp-block-heading">FPM</h3>



<p>FPM o FastCGI Process Manager ha sido el último en llegar, y no es más que una implementación de FastCGI con varias características orientadas a la mejora del comportamiento para  sitios web con mucho tráfico.</p>



<p>Cómo la diferencia entre FastCGI y FPM comienzan  a adentrarse en un terreno muy técnico, no entraremos en mucho detalle, ero si mencionaremos algunas de estas mejoras:</p>



<ul class="wp-block-list"><li>Manejo avanzado para detener/arrancar procesos de forma fácil.</li><li>Posibilidad de iniciar hilos de procesos con diferentes uid/gid/chroot/environment.</li><li>Escuchar en diferentes puertos.</li><li>Usar distintos php.ini</li><li>Uso de safe_mode.</li></ul>



<p>Si quieres ver la lista completa de estas ventajas puedes hacerlo en la página dedicada a <a href="https://www.php.net/manual/es/install.fpm.php" target="_blank" rel="noreferrer noopener" aria-label="FPM en php.net (abre en una nueva pestaña)">FPM en php.net</a>.</p>



<h4 class="wp-block-heading">Ventajas de FPM</h4>



<ul class="wp-block-list"><li>Buen rendimiento.</li><li>Consumo de recursos moderado.</li><li>Todas las ventajas de FastCGI.</li><li>Más opciones de configuración que FastCGI.</li></ul>



<h4 class="wp-block-heading">Inconvenientes de FPM</h4>



<ul class="wp-block-list"><li>Mayor dificultad de instalación y configuración.</li></ul>



<h2 class="wp-block-heading">Tabla comparativa</h2>



<p>Para intentar ser prácticos, podemos resumir lo que hemos visto en una tabla comparativa, que si bien carece de muchos matices puede darnos una visión bastante clara con tan solo un vistazo.</p>



<figure class="wp-block-table"><table><tbody><tr><th></th><th>DSO</th><th>CGI</th><th>FastCGI</th><th>FPM</th></tr><tr><th>Rendimiento</th><td>Bueno</td><td>Malo</td><td>Bueno</td><td>Bueno</td></tr><tr><th>Consumo de recursos</th><td>Alto</td><td>Medio-Alto</td><td>Medio</td><td>Medio</td></tr><tr><th>Archivos propiedad de Apache</th><td>Si</td><td>Si</td><td>No</td><td>No</td></tr><tr><th>Dificultad de configuración</th><td>Baja</td><td>Baja</td><td>Alta</td><td>Alta</td></tr><tr><th>Opciones de configuración</th><td>Media</td><td>Media</td><td>Alta</td><td>Muy Alta</td></tr></tbody></table></figure>



<h2 class="wp-block-heading">mod_php, CGI, FastCGI ó FPM, cuál es mejor?</h2>



<p>Y la respuesta que muchos esperaréis después de leer (o no) esta entrada es: cuál es mejor? Y la respuesta más habitual a este tipo de preguntas es: para qué?</p>





<p>Para entornos de desarrollo, entornos de prueba o para pequeñas intranets sin excesiva carga recomendaría DSO. Es fácil de configurar, rinde bien y no tendremos problemas de recursos. El único motivo por el que me decantaría por otra opción sería si necesitáramos tener más de una versión de php corriendo en la misma máquina. En tal caso la opción más apropiada sería FastCGI.</p>



<p>Si nos vamos al lado opuesto, sites con muchísimo tráfico, dónde confieso que no tengo ninguna experiencia, parece que la mejor opción es FPM, por: rendimiento, consumo de recursos y versatilidad.</p>



<p>Y entre el espacio que dejan las dos situaciones propuestas es quizás dónde mejor encajaría FastCGI, asumiendo que los motivos que influyen en la decisión última no permiten trazar líneas delimitadoras claras y recomendar hasta aquí esta opción y a partir de aquí la otra. En su lugar nos dejan una amplia gama de grises en función de las características del entorno.</p>



<p class="has-text-align-left">Para acabar, personalmente intentaría no utilizaría CGI, pues no encuentro ninguna característica diferenciadora que compense el peor rendimiento y mayor consumo de recursos.</p>



<h2 class="wp-block-heading">Créditos, referencias y artículos relacionados</h2>



<ul class="wp-block-list"><li>Imagen de portada por <a rel="noreferrer noopener" aria-label="Arek Socha (abre en una nueva pestaña)" href="https://blog.ahierro.es/wp-admin/post.php?post=1793&amp;action=edit" target="_blank">Arek Socha</a> en pixabay.</li><li><a href="https://blog.ahierro.es/servidor-web-en-raspberry-pi-y-ubuntu-mate/">Servidor Web en Raspberry PI y Ubuntu Mate</a>.</li><li><a href="https://blog.ahierro.es/archivos-y-permisos-de-usuario-en-apache-y-linux/">Archivos y permisos de usuario en Apache 2 y Linux</a>.</li><li><a href="https://blog.ahierro.es/habilitar-modulos-en-apache-2-sobre-ubuntu/">Habilitar módulos en Apache 2 sobre Ubuntu</a>.</li><li><a rel="noreferrer noopener" aria-label="Handlers en Apache (abre en una nueva pestaña)" href="https://httpd.apache.org/docs/2.4/es/handler.html" target="_blank">Handlers en Apache</a>.</li><li><a rel="noreferrer noopener" aria-label=" (abre en una nueva pestaña)" href="http://www.ietf.org/rfc/rfc3875" target="_blank">RFC de Common Gateway Interface</a>.</li></ul>



<p></p>La entrada <a href="https://blog.ahierro.es/php-mod_php-vs-cgi-vs-fastcgi-vs-fpm/">PHP: mod_php vs CGI vs FastCGI vs FPM</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.ahierro.es/php-mod_php-vs-cgi-vs-fastcgi-vs-fpm/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title>Triggers en MySQL</title>
		<link>https://blog.ahierro.es/triggers-en-mysql/</link>
					<comments>https://blog.ahierro.es/triggers-en-mysql/#respond</comments>
		
		<dc:creator><![CDATA[Andres]]></dc:creator>
		<pubDate>Wed, 25 Sep 2019 06:42:57 +0000</pubDate>
				<category><![CDATA[Bases de Datos]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Sistemas]]></category>
		<category><![CDATA[bases de datos]]></category>
		<category><![CDATA[MySQL]]></category>
		<guid isPermaLink="false">https://blog.ahierro.es/?p=1711</guid>

					<description><![CDATA[<p>Los grandes motores de búsqueda como MySQL, PostgreSQL, SQL Server u Oracle, disponen de una cantidad de funcionalidades realmente extensa. Una de esas funcionalidades son los desencadenadores o triggers, en esta entrada hablaremos sobre ellos. Mi experiencia con los triggers proviene principalmente de SQL Server, plataforma en la que he hecho un uso bastante extenso &#8230; </p>
<p class="link-more"><a href="https://blog.ahierro.es/triggers-en-mysql/" class="more-link">Continuar leyendo<span class="screen-reader-text"> "Triggers en MySQL"</span></a></p>
La entrada <a href="https://blog.ahierro.es/triggers-en-mysql/">Triggers en MySQL</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></description>
										<content:encoded><![CDATA[<p>Los grandes motores de búsqueda como MySQL, PostgreSQL, SQL Server u Oracle, disponen de una cantidad de funcionalidades realmente extensa. Una de esas funcionalidades son los desencadenadores o triggers, en esta entrada hablaremos sobre ellos.</p>



<figure class="wp-block-image is-resized"><img loading="lazy" decoding="async" src="https://blog.ahierro.es/wp-content/uploads/2019/09/mysql_triggers.png" alt="Triggers en Mysql" class="wp-image-1714" width="768" height="270"/></figure>



<p>Mi experiencia con los triggers proviene principalmente de SQL Server, plataforma en la que he hecho un uso bastante extenso de ellos, y me atrevería a asegurar que para algunos programadores, en según que condiciones, los triggers pueden abrir un mundo nuevo de posibilidades, facilitando enormemente la realización de algunas tareas que de no ser por éstos tendrían una resolución  bastante más aparatosa. </p>



<span id="more-1711"></span>



<h2 class="wp-block-heading">Qué son los triggers en MySQL</h2>



<p>Los triggers (o desencadenadores) son pequeños programas creados por el usuario que se invocan de forma automática por el propio motor de bases de datos al producirse ciertos eventos, lo que nos permite capturarlos, controlarlos e intervenir en ellos.</p>



<p>En MySQL los eventos que podemos capturar son los relacionados con las sentencias INSERT, UPDATE y DELETE.</p>



<h2 class="wp-block-heading">Precauciones en el uso de triggers</h2>



<p>Antes de entrar de lleno con ellos, es importante conocer cuales son los  inconvenientes más comunes derivados de su uso para así evitarlos o cuanto menos minimizarlos.</p>



<p>El primero de ellos es el rendimiento. Ejecutar el código programado en el trigger conlleva un consumo de recursos que por norma general suele ser muy superior al de la sentencia que lo origina. Por lo tanto deberemos tener en cuenta esa carga y optimizarla para evitar posibles problemas como ralentización del sistema o interbloqueos.</p>



<p>El segundo inconveniente a tratar es la visibilidad. Hablamos de una porción de código que se encuentra completamente separada del resto, lo que en ocasiones puede provocar que nos olvidemos que está ahí, o que lo desconozcamos  por completo si nos enrolamos en un nuevo proyecto.</p>



<p>Y una recomendación derivada del punto anterior, es poner un extra de atención para asegurar su correcto funcionamiento, o de lo contrario podemos encontrarnos con resultado indeseados mucho tiempo después de su activación.</p>



<p>Por último debemos destacar el efecto global de los triggers, que actuarán siempre que ocurra el evento para el que han sido definidos, independientemente de la aplicación, usuario o cualquier otra variable de sistema que se nos ocurra. Esta condición es intrínseca los triggers y es básicamente lo que buscamos, pero debemos recordarlo si en algún momento actuamos sobre la base de datos desde un lugar diferente al habitual.</p>



<h2 class="wp-block-heading">Cuándo utilizar triggers</h2>



<p style="text-align:left">Desde mi punto de vista los triggers tienen dos escenarios principales de uso:</p>



<p>El primero es cuando no podemos intervenir en el código fuente de la aplicación que trabaja sobre la base de datos sobre la que queremos actuar o reaccionar a sus eventos.</p>



<p>El segundo es cuando a pesar de disponer del código, éste pertenece a un software desarrollado por terceros y existe una probabilidad relativamente alta de aplicar actualizaciones o instalar pluggins, y hemos decidido modificar el código fuente lo menos posible para facilitar este tipo de tareas.</p>



<p>Un ejemplo muy habitual son integraciones de software en las que al menos uno de los programas que intervienen es de código cerrado. En este tipo de situaciones los triggers nos permiten capturar los eventos que modifican la base de datos y actuar en consecuencia, evitando crear tareas programadas y e incluso tablas de integración.</p>



<h2 class="wp-block-heading">Cuándo no utilizar trigger</h2>



<p>Cuando tenemos acceso al código fuente de la aplicación que trabaja sobre la base de datos que nos interesa y no tenemos que mantener ningún tipo de compatibilidad con cambios como nuevas versiones, no existe razón alguna para utilizar triggers. En estos casos será mejor trabajar sobre el código de la aplicación y así evitaremos los inconvenientes de uso de los triggers.</p>





<p>Bien sea para registrar logs de acciones, generar registros de integración, realizar validaciones pre o post inserción o cualquier otra tarea que se nos ocurra, siempre será más eficiente,  más visible y por lo tanto sencillo para el programador delegar esa responsabilidad en la propia aplicación.</p>



<h2 class="wp-block-heading">Usando los triggers</h2>



<p>Muy bien, ya hemos tomado las consideraciones necesarias y hemos decidido utilizar triggers, veamos ahora cómo crearlos.</p>



<h3 class="wp-block-heading">Sentencias sobre las que podemos crear triggers</h3>



<p>Ya lo adelantábamos al comienzo del artículo, podemos crear triggers que actúen sobre las sentencias:</p>



<ul class="wp-block-list"><li>INSERT</li><li>UPDATE</li><li>DELETE</li></ul>



<p>De esta forma podremos intervenir cada vez que se inserte, modifique o elimine un registro.</p>



<p>Cada trigger se define para un tipo de evento, de forma que si queremos controlar los tres eventos para una determinada tabla deberemos crear tres triggers.</p>



<p>También es importante mencionar que los triggers actúan registro a registro, es decir, supongamos que tenemos una sentencia UPDATE que modifica 100 registros, el trigger se ejecutará 100 veces, una  por cada registro modificado</p>



<h3 class="wp-block-heading">BEFORE y AFTER</h3>



<p>Y como complemento al tipo de sentencia, podemos decidir si intervenir antes o después de que ésta realice los cambios. Así un trigger AFTER INSERT nos permitirá actuar una vez que el nuevo registro este insertado, y un trigger BEFORE DELETE lo hará antes de eliminar un registro.</p>



<p>La combinación del tipo de sentencia con BEFORE o AFTER nos ofrecen mucha versatilidad a la hora de diseñar nuestros triggers.</p>



<h3 class="wp-block-heading">NEW y OLD</h3>



<p>NEW y OLD son las palabras reservadas de MySQL para acceder a los valores de los registros sobre los que estamos trabajando.</p>



<ul class="wp-block-list"><li>OLD nos permite acceder a los datos previos a la modificación realizada por la sentencia.</li><li>NEW nos permite acceder a los nuevos datos que propone la sentencia.</li></ul>



<p> La sintaxis es muy sencilla, OLD.campo o NEW.campo, dónde campo es el nombre del campo de la tabla al que queremos acceder.</p>





<h3 class="wp-block-heading">Cómo crear un trigger en MySQL</h3>



<p>Y una buena forma de aprender a crear un triggers es mediante un ejemplo, así que veamos uno. Supongamos que tenemos la tabla <em>brands</em> que forma parte de la base de datos de un software propietario:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; gutter: false; title: ; notranslate">
+----+----------+---------+
| ID | Name     | Segment |
+----+----------+---------+
|  1 | Opel     | Mass    |
|  2 | Renault  | Mass    |
|  3 | Ford     | Mass    |
|  4 | Audi     | Premium |
|  5 | Mercedes | Premium |
|  6 | Porche   | Luxury  |
|  7 | Ferrari  | Luxury  |
+----+----------+---------+
</pre></div>


<p>Y queremos registrar los cambios que se producen para integrarlos con otro sistema, para lo que hemos creado una tabla en la que registraremos cualquier cambio que se produzca en la tabla <em>brands</em>. La nueva tabla la hemos llamado <em>integration</em>, y tiene los siguientes campos:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
+----+--------+----------+--------+---------------------+-----------+---------------+------------+
| ID | Object | ObjectID | Action | DateCreated         | Processed | DateProcessed | ErrorCount |
+----+--------+----------+--------+---------------------+-----------+---------------+------------+

</pre></div>


<p>Para registrar todos los cambios que se produzcan en la tabla <em>brands</em> deberemos generar tres triggers:</p>



<ul class="wp-block-list"><li>Uno para registrar los nuevos registros: AFTER INSERT.</li><li>Uno para registrar los cambios: AFTER UPDATE.</li><li>Uno para registrar las eliminaciones: BEFORE DELETE.</li></ul>



<p>En esta entrada crearemos únicamente el trigger para la sentencia INSERT. Crear el resto de triggers se hace de forma muy similar, y en caso de que estés interesado en aprender será una buena práctica.</p>



<p>Así que veamos como crear el trigger, que será el encargado de registrar las nuevas marcas:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
delimiter //
CREATE TRIGGER brandsInsertLog AFTER INSERT ON brands
FOR EACH ROW
BEGIN

	INSERT INTO integration (`Object`, `ObjectID`, `Action`, `DateCreated`, `Processed`, `DateProcessed`, `ErrorCount`) 
	VALUES (&#039;brands&#039;, NEW.ID, &#039;insert&#039;, now(), 0, null, 0);

END;//
delimiter;

</pre></div>


<p>De forma que si ejecutásemos una sentencia de de inserción sobre la tabla <em>brands</em>:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
INSERT INTO `osticket`.`brands` (`ID`, `Name`, `Segment`)
VALUES (8, &#039;Citroen&#039;, &#039;Mass&#039;);
</pre></div>


<p>Se registraría automáticamente la entrada correspondiente en la tabla <em>integration</em>:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
+----+--------+----------+--------+---------------------+-----------+---------------+------------+
| ID | Object | ObjectID | Action | DateCreated         | Processed | DateProcessed | ErrorCount |
+----+--------+----------+--------+---------------------+-----------+---------------+------------+
|  1 | brands |        8 | insert | 2019-09-21 08:20:07 |         0 | NULL          |          0 |
+----+--------+----------+--------+---------------------+-----------+---------------+------------+

</pre></div>


<p>Así de sencillo. Espero que esta entrada te haya servido de ayuda y si es así un comentario siempre es de agradecer.</p>



<h2 class="wp-block-heading">Créditos, referencias y artículos relacionados</h2>



<ul class="wp-block-list"><li>Imagen <a rel="noreferrer noopener" aria-label="Peggy und Marco Lachmann-Anke (abre en una nueva pestaña)" href="https://pixabay.com/users/3d_maennchen-1553824/" target="_blank">Peggy und Marco Lachmann-Anke</a> en pixabay.</li><li><a rel="noreferrer noopener" aria-label="Documentación sobre triggers de María DB (abre en una nueva pestaña)" href="https://mariadb.com/kb/en/library/trigger-overview/" target="_blank">Documentación sobre triggers de María DB</a></li><li><a rel="noreferrer noopener" aria-label="Documentación sobre triggers de MySQL (abre en una nueva pestaña)" href="https://dev.mysql.com/doc/refman/5.7/en/triggers.html" target="_blank">Documentación sobre triggers de MySQL</a></li><li><a href="https://blog.ahierro.es/backup-de-base-de-datos-mysql-con-php/">Backup de base de datos MySQL con PHP</a></li><li><a href="https://blog.ahierro.es/servidor-web-en-raspberry-pi-y-ubuntu-mate/">Servidor Web en Raspberry PI y Ubuntu Mate</a></li></ul>La entrada <a href="https://blog.ahierro.es/triggers-en-mysql/">Triggers en MySQL</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.ahierro.es/triggers-en-mysql/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Aumentar el límite de memoria de un script en PHP</title>
		<link>https://blog.ahierro.es/aumentar-el-limite-de-memoria-de-un-script-en-php/</link>
					<comments>https://blog.ahierro.es/aumentar-el-limite-de-memoria-de-un-script-en-php/#respond</comments>
		
		<dc:creator><![CDATA[Andres]]></dc:creator>
		<pubDate>Wed, 18 Sep 2019 06:55:37 +0000</pubDate>
				<category><![CDATA[Servicios]]></category>
		<category><![CDATA[Sistemas]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[web]]></category>
		<guid isPermaLink="false">https://blog.ahierro.es/?p=1656</guid>

					<description><![CDATA[<p>La configuración por defecto de un servidor LAMP es válida para el correcto funcionamiento de la mayoría de las páginas web. Sin embargo, si ejecutamos aplicaciones que necesitan de una gran cantidad de recursos del sistema es posible estos valores se nos queden cortos en algunos momentos. Y uno de esos valores que a veces &#8230; </p>
<p class="link-more"><a href="https://blog.ahierro.es/aumentar-el-limite-de-memoria-de-un-script-en-php/" class="more-link">Continuar leyendo<span class="screen-reader-text"> "Aumentar el límite de memoria de un script en PHP"</span></a></p>
La entrada <a href="https://blog.ahierro.es/aumentar-el-limite-de-memoria-de-un-script-en-php/">Aumentar el límite de memoria de un script en PHP</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></description>
										<content:encoded><![CDATA[<p>La configuración por defecto de un servidor LAMP es válida para el correcto funcionamiento de la mayoría de las páginas web.  Sin embargo, si ejecutamos aplicaciones que necesitan de una gran cantidad de recursos del sistema es posible estos valores se nos queden cortos en algunos momentos.</p>



<figure class="wp-block-image is-resized"><img loading="lazy" decoding="async" src="https://blog.ahierro.es/wp-content/uploads/2019/08/chips-20072_1920-1024x683.jpg" alt="Aumentar el límite de memoria de un script en PHP" class="wp-image-1673" width="798" height="413"/></figure>



<span id="more-1656"></span>



<p>Y uno de esos valores que a veces se quedan cortos es la cantidad de memoria máxima que un script desarrollado en PHP puede consumir, así que hoy veremos como aumentar ese límite.</p>



<h2 class="wp-block-heading">Fatal error: Allowed memory size of 134217728 bytes exhausted</h2>



<p>Alcanzar el límite máximo de memoria de nuestro servidor no es algo demasiado habitual. La configuración por defecto tiene un valor lo suficientemente amplio como para que podamos ejecutar la mayoría de las aplicaciones sin problema alguno. Pero en caso de alcanzarlo,el sistema devuelve el siguiente error:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; gutter: false; title: ; notranslate">
Fatal error: Allowed memory size of 134217728 bytes exhausted
</pre></div>


<p>Con la salvedad de que el número de bytes puede variar en función de la configuración del servidor.</p>





<h2 class="wp-block-heading">Medida de protección</h2>



<p>Que PHP disponga de un límite máximo de consumo de memoria en la ejecución de cada script es una medida de protección, no olvidemos que la memoria en una máquina es un recurso finito. Así que antes de ampliar este parámetro, mi consejo es que nos aseguremos de que:</p>



<ol class="wp-block-list"><li>No es un bug en nuestro script el que crea la necesidad de ampliar la memoria.</li><li>Nuestro script está razonablemente optimizado.</li></ol>



<p>Es decir, nada que no debamos hacer con cualquier otro script que no supere el límite máximo de memoria definido. Porque si recordáis una de las primeras lecciones que aprendemos (o al menos que deberíamos aprender) al comenzar a programar es que nuestro código debe cumplir tres requisitos fundamentales:</p>



<ol class="wp-block-list"><li>Estar libre de errores</li><li>Ser eficiente</li><li>Ser comprensible</li></ol>



<h2 class="wp-block-heading">Cómo aumentar el límite máximo de memoria para un script PHP</h2>



<p>Por defecto, el límite máximo de memoria que un script PHP puede consumir es de 128Mb, algo más que razonable. Si ya tenemos claro que queremos aumentar este límite podemos hacerlo de dos formas.</p>



<h3 class="wp-block-heading">Con la función init_set()</h3>



<p>Con la función <em>init_set() </em>pasando el string<em> memory_limit </em>como primer parámetro y la cantidad de memoria deseada como segundo. Con este método, el nuevo limite afectará única y exclusivamente al script dónde lo estemos utilizando, es decir, sin afectar a la configuración general del servidor.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: php; title: ; notranslate">
&lt;?php

ini_set(&#039;memory_limit&#039;, &#039;256M&#039;);

...

?&gt;
</pre></div>


<h3 class="wp-block-heading">En el archivo php.ini</h3>



<p>En este caso, la principal diferencia con respecto al método anterior es que el nuevo límite afectará a todos los scripts PHP que se ejecuten en el servidor dónde apliquemos esta configuración. Para definir el nuevo límite, buscamos la directriz <em>memory_limit,</em> dentro de la sección <em>Resources Limits</em>, en el archivo <em>php.ini</em> y modificamos su valor.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; gutter: false; title: ; notranslate">
;;;;;;;;;;;;;;;;;;;
; Resource Limits ;
;;;;;;;;;;;;;;;;;;;

...

; Maximum amount of memory a script may consume (128MB)
; http://php.net/memory-limit
memory_limit=256M
</pre></div>


<p>Y acto seguido reiniciamos el servidor Apache 2 para que los cambios surtan efecto.:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
sudo service apache2 restart
</pre></div>


<p>La ubicación del archivo <em>php.ini </em>variará en función del sistema que estemos utilizando. En los sistemas Linux basados en Debian como Ubuntu la ubicación será <em>/etc/php/X.X/apache2</em>, donde X.X será la versión de PHP.</p>





<h2 class="wp-block-heading">Comprobar límite máximo de memoria de un script PHP</h2>



<p>Podemos comprobar el valor máximo de memoria que utiliza un script configurado en nuestro servidor en la sección <em>Core </em>de la salida de la función <em>phpinfo()</em>:</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="417" height="122" src="https://blog.ahierro.es/wp-content/uploads/2019/09/phpinfo_memory_limit.png" alt="phpinfo() memory_limit" class="wp-image-1705" srcset="https://blog.ahierro.es/wp-content/uploads/2019/09/phpinfo_memory_limit.png 417w, https://blog.ahierro.es/wp-content/uploads/2019/09/phpinfo_memory_limit-300x88.png 300w" sizes="auto, (max-width: 417px) 100vw, 417px" /></figure>



<p>O como acabamos de ver, accediendo al archivo de configuración php.ini:</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="415" height="157" src="https://blog.ahierro.es/wp-content/uploads/2019/09/php_ini_memory_limit.png" alt="php.ini memory_limit" class="wp-image-1706" srcset="https://blog.ahierro.es/wp-content/uploads/2019/09/php_ini_memory_limit.png 415w, https://blog.ahierro.es/wp-content/uploads/2019/09/php_ini_memory_limit-300x113.png 300w" sizes="auto, (max-width: 415px) 100vw, 415px" /></figure>



<h2 class="wp-block-heading">Créditos, referencias y artículos relacionados</h2>



<ul class="wp-block-list"><li>Imagen de portada: <a href="https://pixabay.com/users/publicdomainpictures-14/">Public Domain Pictures</a></li><li><a href="https://blog.ahierro.es/aumentar-el-limite-de-tiempo-maximo-de-ejecucion-de-un-script-en-php/">Aumentar el limite de tiempo máximo de ejecución de un script en PHP</a>.</li><li><a rel="noreferrer noopener" aria-label="Documentación de la función init_set() (abre en una nueva pestaña)" href="https://www.php.net/manual/es/function.ini-set.php" target="_blank">Documentación de la función php init_set()</a></li><li><a aria-label="Documentación de la función init_set() (abre en una nueva pestaña)" href="https://blog.ahierro.es/servidor-web-en-raspberry-pi-y-ubuntu-mate/">Servidor Web en Raspberry PI y Ubuntu Mate</a></li><li><a href="https://blog.ahierro.es/como-configurar-virtual-hosts-en-apache-y-ubuntu/">Como configurar Virtual Hosts en Apache 2 y Ubuntu</a></li><li><a href="https://blog.ahierro.es/habilitar-modulos-en-apache-2-sobre-ubuntu/">Habilitar módulos en Apache 2 sobre Ubuntu</a></li></ul>La entrada <a href="https://blog.ahierro.es/aumentar-el-limite-de-memoria-de-un-script-en-php/">Aumentar el límite de memoria de un script en PHP</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.ahierro.es/aumentar-el-limite-de-memoria-de-un-script-en-php/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>E: No se pudo obtener el bloqueo /var/lib/dpkg/lock – open (recurso temporalmente no disponible)</title>
		<link>https://blog.ahierro.es/no-se-pudo-obtener-el-bloqueo-var-lib-dpkg-lock-open-recurso-temporalmente-no-disponible/</link>
					<comments>https://blog.ahierro.es/no-se-pudo-obtener-el-bloqueo-var-lib-dpkg-lock-open-recurso-temporalmente-no-disponible/#respond</comments>
		
		<dc:creator><![CDATA[Andres]]></dc:creator>
		<pubDate>Tue, 20 Aug 2019 06:26:47 +0000</pubDate>
				<category><![CDATA[Errores y problemas]]></category>
		<category><![CDATA[Sistemas]]></category>
		<category><![CDATA[linux]]></category>
		<guid isPermaLink="false">https://blog.ahierro.es/?p=1621</guid>

					<description><![CDATA[<p>Este error ocurre con relativa frecuencia en distribuciones que utilizan el gestor de paquetes Dpkg para instalar o desinstalar software: Debian, Ubuntu y derivadas. En este artículo veremos como solucionarlo. El error es muy similar a este otro «E: No se pudo bloquear /var/lib/apt/lists/lock &#8211; open (11 Recurso no disponible temporalmente)«, y es fácil confundirlos &#8230; </p>
<p class="link-more"><a href="https://blog.ahierro.es/no-se-pudo-obtener-el-bloqueo-var-lib-dpkg-lock-open-recurso-temporalmente-no-disponible/" class="more-link">Continuar leyendo<span class="screen-reader-text"> "E: No se pudo obtener el bloqueo /var/lib/dpkg/lock – open (recurso temporalmente no disponible)"</span></a></p>
La entrada <a href="https://blog.ahierro.es/no-se-pudo-obtener-el-bloqueo-var-lib-dpkg-lock-open-recurso-temporalmente-no-disponible/">E: No se pudo obtener el bloqueo /var/lib/dpkg/lock – open (recurso temporalmente no disponible)</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></description>
										<content:encoded><![CDATA[<p>Este error ocurre con relativa frecuencia en distribuciones que utilizan el gestor de paquetes Dpkg para instalar o desinstalar software: Debian, Ubuntu y derivadas. En este artículo veremos como solucionarlo.</p>



<figure class="wp-block-image is-resized"><img loading="lazy" decoding="async" src="https://blog.ahierro.es/wp-content/uploads/2019/08/bloquear-var-lib-dpkg-lock.png" alt="No se pudo obtener el bloqueo /var/lib/dpkg/lock – open (recurso temporalmente no disponible)" class="wp-image-1646" width="789" height="471" srcset="https://blog.ahierro.es/wp-content/uploads/2019/08/bloquear-var-lib-dpkg-lock.png 789w, https://blog.ahierro.es/wp-content/uploads/2019/08/bloquear-var-lib-dpkg-lock-300x179.png 300w, https://blog.ahierro.es/wp-content/uploads/2019/08/bloquear-var-lib-dpkg-lock-768x459.png 768w" sizes="auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px" /></figure>



<span id="more-1621"></span>



<p>El error es muy similar a este otro «<a href="https://blog.ahierro.es/no-se-pudo-bloquear-var-lib-apt-lists-lock-open-11-recurso-no-disponible-temporalmente/">E: No se pudo bloquear /var/lib/apt/lists/lock &#8211; open (11 Recurso no disponible temporalmente)</a>«, y es fácil confundirlos si no prestamos la atención suficiente. Ambos ocurren cuando realizamos tareas de instalación o des-instalación de software, la diferencia radica  en que mientras uno está relacionado con Apt, el otro está relacionado con Dpkg.</p>



<h2 class="wp-block-heading">El error</h2>



<p>El error se produce al intentar instalar o des-instalar alguna aplicación. Cuando el sistema hace uso del gestor de paquetes Dpkg, y éste intenta bloquear los recursos necesarios para realizar sus tareas, se encuentra que estos ya están bloqueados y lanza el siguiente error:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; gutter: false; title: ; notranslate">
E: No se pudo bloquear /var/lib/dpkg/lock - open (11 Recurso no disponible temporalmente)
E: Unable to acquire the dpkg No se pudo bloquear el directorio (/var/lib/dpkg/), ¿quizás haya algún otro proceso utilizándolo?
</pre></div>


<p>Es bastante habitual que ese bloqueo esté producido por algún problema en operaciones anteriores, y que en el momento de encontrarnos con el error no exista ningún proceso activo utilizando esos recursos. No obstante debemos asegurarnos de ello.</p>



<h2 class="wp-block-heading">La solución</h2>



<p>La solución es rápida y sencilla. Como hemos dicho, comenzamos comprobando si existe algún proceso activo utilizando el archivo que genera el bloqueo:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
sudo fuser -v /var/lib/dpkg/lock
</pre></div>


<p>En caso de que haya algún proceso activo provocando el bloqueo deberemos decidir si lo dejamos terminar o si por el contrario lo matamos, mi recomendación es ser razonablemente pacientes. Si optamos por  matarlo, volveremos a hacer uso del comando <em>fuser</em>, añadiendo dos modificadores más:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
sudo fuser -vki /var/lib/dpkg/lock 
</pre></div>


<p>Si era un proceso el causante del y este ha concluido su tarea, lo más probable es que el error ya no persista.</p>



<p>Si por el contrario no había proceso activo, o lo había pero decidimos matarlo, deberemos eliminar el archivo que sigue generando el bloqueo: </p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
sudo rm /var/lib/dpkg/lock
</pre></div>


<p>Y con esto ya habremos terminado y podremos realizar la tarea que no pudimos inicialmente.</p>La entrada <a href="https://blog.ahierro.es/no-se-pudo-obtener-el-bloqueo-var-lib-dpkg-lock-open-recurso-temporalmente-no-disponible/">E: No se pudo obtener el bloqueo /var/lib/dpkg/lock – open (recurso temporalmente no disponible)</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.ahierro.es/no-se-pudo-obtener-el-bloqueo-var-lib-dpkg-lock-open-recurso-temporalmente-no-disponible/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>E: No se pudo bloquear /var/lib/apt/lists/lock &#8211; open (11 Recurso no disponible temporalmente)</title>
		<link>https://blog.ahierro.es/no-se-pudo-bloquear-var-lib-apt-lists-lock-open-11-recurso-no-disponible-temporalmente/</link>
					<comments>https://blog.ahierro.es/no-se-pudo-bloquear-var-lib-apt-lists-lock-open-11-recurso-no-disponible-temporalmente/#comments</comments>
		
		<dc:creator><![CDATA[Andres]]></dc:creator>
		<pubDate>Tue, 20 Aug 2019 06:26:04 +0000</pubDate>
				<category><![CDATA[Errores y problemas]]></category>
		<category><![CDATA[Sistemas]]></category>
		<category><![CDATA[linux]]></category>
		<guid isPermaLink="false">https://blog.ahierro.es/?p=1595</guid>

					<description><![CDATA[<p>Si eres usuario de alguna distribución de Linux que utiliza Apt como gestor de paquetes, es muy probable que en alguna ocasión hayas recibido este error al intentar actualizar los repositorios. Veamos como solucionarlo. El caso es que en los últimos meses me he encontrado en varias ocasiones con el error del título, y con &#8230; </p>
<p class="link-more"><a href="https://blog.ahierro.es/no-se-pudo-bloquear-var-lib-apt-lists-lock-open-11-recurso-no-disponible-temporalmente/" class="more-link">Continuar leyendo<span class="screen-reader-text"> "E: No se pudo bloquear /var/lib/apt/lists/lock &#8211; open (11 Recurso no disponible temporalmente)"</span></a></p>
La entrada <a href="https://blog.ahierro.es/no-se-pudo-bloquear-var-lib-apt-lists-lock-open-11-recurso-no-disponible-temporalmente/">E: No se pudo bloquear /var/lib/apt/lists/lock – open (11 Recurso no disponible temporalmente)</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></description>
										<content:encoded><![CDATA[<p>Si eres usuario de alguna distribución de Linux que utiliza Apt como gestor de paquetes, es muy probable que en alguna ocasión hayas recibido este error al intentar actualizar los repositorios. Veamos como solucionarlo.</p>



<figure class="wp-block-image is-resized"><img loading="lazy" decoding="async" src="https://blog.ahierro.es/wp-content/uploads/2019/08/bloquear-var-lib-apt-lists-lock.png" alt="No se pudo obtener el bloqueo /var/lib/dpkg/lock – open (recurso temporalmente no disponible)" class="wp-image-1616" width="789" height="357"/></figure>



<span id="more-1595"></span>



<p>El caso es que en los últimos meses me he encontrado en varias ocasiones con el error del título, y con este otro «<a href="https://blog.ahierro.es/no-se-pudo-obtener-el-bloqueo-var-lib-dpkg-lock-open-recurso-temporalmente-no-disponible/">No se pudo obtener el bloqueo /var/lib/dpkg/lock – open (recurso temporalmente no disponible)</a>«, que es tan parecido que si no leemos atentamente puede llevarnos a errar en el diagnóstico del problema. Y si bien las soluciones son prácticamente iguales, los detalles distan mucho, y podríamos estar intentando curar un catarro con las medicinas para curar una gastroenteritis. Pero no  me enrollo mas y vayamos al lío.</p>



<h2 class="wp-block-heading">El error</h2>



<p>El error se produce al intentar actualizar los repositorios o realizar otras tareas relacionadas con el gestor de paquetes Apt, y la salida en pantalla completa es la siguiente:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; gutter: false; title: ; notranslate">
E: No se pudo bloquear /var/lib/apt/lists/lock - open (11 Recurso no disponible temporalmente)
E: No se pudo bloquear el directorio (/var/lib/apt/lists/)
</pre></div>


<p>El origen del problema radica en que intentamos acceder a un recurso que está bloqueado por otro proceso. Lo más habitual es que ese otro proceso ya no exista, y que el recurso que necesitamos haya quedado bloqueado por algún problema en una operación anterior. No obstante, es mejor ser cautos y verificar si ese bloqueo esté motivado por una algún proceso activo. </p>



<h2 class="wp-block-heading">La Solución</h2>



<p>La solución al problema es rápida y sencilla. En primer lugar comprobamos si existe algún proceso utilizando el archivo que genera el bloqueo:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
sudo fuser -v /var/lib/apt/lists/lock 
</pre></div>


<p>En caso de que haya algún proceso, deberemos decidir si lo dejamos terminar o si lo matamos. Si optamos por  matarlo, podemos hacerlo con el mismo comando <em>fuser</em>, tan solo añadiendo algunos modificadores más:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
sudo fuser -vki /var/lib/apt/lists/lock 
</pre></div>


<p>Y acto seguido, e independientemente de si había o no un proceso activo, eliminamos el archivo que provoca el bloqueo:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
sudo rm /var/lib/apt/lists/lock
</pre></div>


<p>Y con esto ya podríamos volver a actualizar nuestros repositorios o realizar la tarea que no pudimos completar al encontrarnos con este inconveniente.</p>La entrada <a href="https://blog.ahierro.es/no-se-pudo-bloquear-var-lib-apt-lists-lock-open-11-recurso-no-disponible-temporalmente/">E: No se pudo bloquear /var/lib/apt/lists/lock – open (11 Recurso no disponible temporalmente)</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.ahierro.es/no-se-pudo-bloquear-var-lib-apt-lists-lock-open-11-recurso-no-disponible-temporalmente/feed/</wfw:commentRss>
			<slash:comments>18</slash:comments>
		
		
			</item>
		<item>
		<title>Ubuntu en dispositivos táctiles</title>
		<link>https://blog.ahierro.es/ubuntu-en-dispositivos-tactiles/</link>
					<comments>https://blog.ahierro.es/ubuntu-en-dispositivos-tactiles/#respond</comments>
		
		<dc:creator><![CDATA[Andres]]></dc:creator>
		<pubDate>Wed, 14 Aug 2019 06:18:08 +0000</pubDate>
				<category><![CDATA[Sistemas]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[ubuntu]]></category>
		<guid isPermaLink="false">https://blog.ahierro.es/?p=1562</guid>

					<description><![CDATA[<p>Desde hace varias semanas vengo probando como funciona Ubuntu Desktop 19.04 en un dispositivo táctil sin teclado. Os cuento como ha sido mi experiencia. El caso es que tengo un pc (o tablet) Microsoft Surface Pro 1 en el que tenía instalado Windows 10. La verdad es que esa combinación funciona muy bien para el &#8230; </p>
<p class="link-more"><a href="https://blog.ahierro.es/ubuntu-en-dispositivos-tactiles/" class="more-link">Continuar leyendo<span class="screen-reader-text"> "Ubuntu en dispositivos táctiles"</span></a></p>
La entrada <a href="https://blog.ahierro.es/ubuntu-en-dispositivos-tactiles/">Ubuntu en dispositivos táctiles</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></description>
										<content:encoded><![CDATA[<p>Desde hace varias semanas vengo probando como funciona Ubuntu Desktop 19.04 en un dispositivo táctil sin teclado. Os cuento como ha sido mi experiencia.</p>



<figure class="wp-block-image is-resized"><img loading="lazy" decoding="async" src="https://blog.ahierro.es/wp-content/uploads/2019/08/Ubuntu-Tablet-image.jpg.jpg" alt="Ubuntu en dispositivos táctiles" class="wp-image-1567" width="840" height="379"/></figure>



<span id="more-1562"></span>



<p>El caso es que tengo un pc (o tablet) Microsoft Surface Pro 1 en el que tenía instalado Windows 10. La verdad es que esa combinación funciona muy bien para el uso que hago de este dispositivo: consultas varias en internet, escribir este blog, sincronizar algún gadget, etc., en fin, un uso lúdico y poco intensivo. Pero desde hace ya algún tiempo rondaba por mi cabeza la idea de probar cómo iría con alguna distribución de Linux.</p>



<h2 class="wp-block-heading">Microsoft Surface Pro 1</h2>



<p>Para aquellos que no conozcan este dispositivo os dejo una pequeña presentación. El equipo tiene ya algunos añitos, concretamente 6, salio a la venta en 2012 pero yo lo adquirí en 2013. Tiene un procesador Intel Core I5-3317U con dos cores a 1.70GHz, 4GB de memoria RAM, 128GB de disco duro SSD y una pantalla de 10,6 pulgadas con una resolución de 1920&#215;1080.</p>



<p>En la practica es un equipo  pesado en relación a su tamaño, se calienta demasiado y su batería difícilmente duraba dos horas con Windows 8 o con Windows 10.</p>



<h2 class="wp-block-heading">Elección de distribución</h2>



<p>En mi ordenador personal utilizo Xubuntu, y estoy muy contento con esta distribución, de hecho me siento mucho más cómodo con su escritorio Xfce que con GNOME o KDE, así que fue mi primera opción. Pero tras probarlo desde un live usb lo descarté sobre la marcha, el teclado en pantalla no aparecía por defecto, y aunque sé que podría encontrar alguno en los repositorios, digamos que lo tomé como un presagio y no tenía ganas de buscarme complicaciones.</p>





<p>La segunda opción fue Ubuntu 19.04, también desde live usb. En este caso el teclado en pantalla apareció desde que situé el foco en un cuadro de texto. Y aunque en ese momento existían algunos detalles que no me convencían, la existencia de apartados dedicados a la configuración de accesibilidad para ratón y teclado, unido al teclado en pantalla me convencieron. Así que me despedí de Windows e instalé Ubuntu, un HD de 128GB no es territorio para que convivan dos sistemas operativos.</p>



<h2 class="wp-block-heading">Experiencia con Ubuntu en dispositivos táctiles</h2>



<p>Y ahora que ya os he soltado la chapa, vamos a revisar los aspectos que considero más relevantes de mi experiencia con Ubuntu en la tablet Microsoft Surface.</p>



<h3 class="wp-block-heading">Teclado en pantalla</h3>



<p>Ubuntu Desktop tiene el teclado en pantalla instalado por defecto, así que podremos utilizarlo tanto ejecutando la distro desde el live usb como en el proceso de instalación, y por supuesto una vez instalado en nuestro equipo.</p>



<p>El teclado en pantalla está estéticamente bien logrado y no me resulta nada intrusivo en el despliegue, es más estos dos puntos me parecen sensacionales. Su funcionamiento es bueno, salvo al escribir en la barra de direcciones de Firefox que tiene un comportamiento errático. Este problema no lo he notado en ningún otro programa.</p>



<p>El principal inconveniente con este teclado es que es excesivamente sencillo, no dispone de teclas de dirección, ni de teclas de función (F1, F2&#8230;), ni de teclas de control (Alt, Ctrl, Esc&#8230;). Parece pensado para utilizarse en una tablet tipo Android más que en un pc.</p>



<p>Esto me ha obligado a instalar un segundo teclado en palla para solventar las situaciones en las que necesito hacer uso de alguna de las teclas de las que no dispongo, algo que me resulta muy engorroso. </p>



<p>Este teclado auxiliar se llama Florence Virtual Keyboard, y está muy bien para salir del paso, pero personalmente no me convence como teclado principal. Si quieres instalarlo:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
sudo apt-get update
sudo apt-get install florence
</pre></div>


<p>Afortunadamente este tipo de teclas, por el uso que hago del dispositivo, las utilizo poco. Pero si tú haces uso intensivo de ellas, el teclado en pantalla de Ubuntu se te quedará corto.</p>



<h3 class="wp-block-heading">Stylus</h3>



<p>La tablet Microsoft surface 1 viene con un lápiz o stylus con cuatro funciones principales: puntero, click izquierdo, click derecho y borrar. Mi stylus ha perdido esta última funcionalidad así que os hablaré de las otras tres.</p>



<p>El puntero funciona perfectamente, al igual que la simulación del click del botón izquierdo del ratón. La simulación del click derecho en cambio no funciona desde un principio, pero tras una sencilla búsqueda en internet pude solucionarlo. Tan solo tenemos que hacer que Ubuntu ejecute el siguiente comando tras el arranque:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
xmodmap -e &quot;pointer = 1 3 2 4 5 6 7 8 9 10&quot;
</pre></div>


<h3 class="wp-block-heading">Acciones táctiles</h3>



<p>El manejo de la tablet sin el lápiz está conseguido a medias. Si bien la respuesta a las acciones táctiles es buena, no he conseguido simular el click derecho del ratón de una forma satisfactoria. A pesar de que  en el apartado «Acceso Universal», dentro de la configuración de Ubuntu, existe un apartado para este propósito, el resultado no me ha convencido en absoluto. </p>



<h3 class="wp-block-heading">Rotación de pantalla</h3>



<p>La rotación de la pantalla es otra de las funcionalidades que vienen por defecto. Su funcionamiento es muy bueno, la respuesta al giro es adecuada y el escritorio y los programas se adaptan perfectamente a visualizaciones tanto horizontales como verticales. Además en las herramientas situadas en la esquina superior derecha podemos bloquear la rotación, algo muy de agradecer en un dispositivo de estas características.</p>



<h3 class="wp-block-heading">Duración de la batería</h3>



<p>Un aspecto que me ha sorprendido gratamente y que no me esperaba es la duración de la batería. Si con Windows 10 rara vez conseguía tener dos horas reales de uso de la tablet, con Ubuntu he conseguido duplicar esta autonomía. Evidentemente esto dependerá del uso que hagamos del dispositivo, y es posible que en usos más intensivos la diferencia entre los dos sistemas se reduzca.</p>





<p>Además, algo con un origen muy en relación a la duración de la batería, es que la tablet ahora se calienta menos que cuando tenía instalado Windows.</p>



<h2 class="wp-block-heading">Conclusión</h2>



<p>El uso de Ubuntu en dispositivos táctiles tiene sus luces y sus sombras. La experiencia de usuario está lejos de ser perfecta, pero aun así, para mi ha sido más que suficiente para decidirme a cambiar.</p>



<h2 class="wp-block-heading">Créditos, referencia y artículos relacionados</h2>



<ul class="wp-block-list"><li><a href="https://blog.ahierro.es/averiguar-que-version-de-linux-tengo-instalada/">Averiguar que versión de Linux tengo instalada</a>.</li><li><a href="https://blog.ahierro.es/como-instalar-linux-dentro-de-windows-10-utilizando-wsl-1/">Cómo instalar Linux dentro de Windows 10 utilizando WSL 1</a></li><li><a href="https://blog.ahierro.es/actualizacion-de-windows-10-machaca-el-gestor-de-arranque-de-linux/">Actualización de Windows 10 machaca el gestor de arranque de Linux</a></li></ul>La entrada <a href="https://blog.ahierro.es/ubuntu-en-dispositivos-tactiles/">Ubuntu en dispositivos táctiles</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.ahierro.es/ubuntu-en-dispositivos-tactiles/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Aumentar el limite de tiempo maximo de ejecución de un script en PHP</title>
		<link>https://blog.ahierro.es/aumentar-el-limite-de-tiempo-maximo-de-ejecucion-de-un-script-en-php/</link>
					<comments>https://blog.ahierro.es/aumentar-el-limite-de-tiempo-maximo-de-ejecucion-de-un-script-en-php/#respond</comments>
		
		<dc:creator><![CDATA[Andres]]></dc:creator>
		<pubDate>Tue, 30 Jul 2019 06:41:08 +0000</pubDate>
				<category><![CDATA[Servicios]]></category>
		<category><![CDATA[Sistemas]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[web]]></category>
		<guid isPermaLink="false">https://blog.ahierro.es/?p=1522</guid>

					<description><![CDATA[<p>Cuando instalamos un servidor web LAMP, la configuración por defecto de PHP es válida para la mayoría de las aplicaciones. Sin embargo, es posible que si desarrollamos o instalamos aplicaciones que necesiten de una gran cantidad de recursos del sistema nos encontremos con algunos límites. Algunos de ellos pueden ser: la memoria consumida en la &#8230; </p>
<p class="link-more"><a href="https://blog.ahierro.es/aumentar-el-limite-de-tiempo-maximo-de-ejecucion-de-un-script-en-php/" class="more-link">Continuar leyendo<span class="screen-reader-text"> "Aumentar el limite de tiempo maximo de ejecución de un script en PHP"</span></a></p>
La entrada <a href="https://blog.ahierro.es/aumentar-el-limite-de-tiempo-maximo-de-ejecucion-de-un-script-en-php/">Aumentar el limite de tiempo maximo de ejecución de un script en PHP</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></description>
										<content:encoded><![CDATA[<p>Cuando instalamos un servidor web LAMP, la configuración por defecto de PHP es válida para la mayoría de las aplicaciones. Sin embargo, es posible que si desarrollamos o instalamos aplicaciones que necesiten de una gran cantidad de recursos del sistema nos encontremos con algunos límites.</p>



<figure class="wp-block-image is-resized"><img loading="lazy" decoding="async" src="https://blog.ahierro.es/wp-content/uploads/2019/07/max_execution_time.jpg" alt="php max_execution_time" class="wp-image-1533" width="840" height="331"/></figure>



<span id="more-1522"></span>



<p>Algunos de ellos pueden ser: la memoria consumida en la ejecución del script, el tamaño de los archivos subidos al servidor, el número de variables pasadas por get o por post, etc.</p>



<p>En esta estrada hablamos sobre el límite de tiempo de ejecución de un script.</p>



<h2 class="wp-block-heading">Fatal error: Maximum execution time of 30 seconds exceeded</h2>



<p>Este es el error que nos encontraremos si nuestro script sobrepasa el tiempo máximo de ejecución definido.</p>



<p>Encontrarnos con este error no es una situación excesivamente habitual y en muchos casos puede ser el resultado de un error de programación, como por ejemplo una rutina que nos haga entrar en un bucle infinito.</p>





<p>Pero también es posible alcanzar ese límite por las propias exigencias de nuestro software. En mi caso, me he encontrado con esta situación al desarrollar aplicaciones empresariales que procesan una gran cantidad de datos.</p>



<h2 class="wp-block-heading">Medida de protección</h2>



<p>Que PHP disponga de un límite máximo de tiempo de ejecución para los scripts es una medida de protección que puede librarnos de largas esperas e incluso de algún reinicio. La experiencia me dice que en algunas ocasiones un bucle infinito puede dejar un equipo completamente bloqueado.</p>



<p>Así que antes de ampliar el tiempo máximo de ejecución mi consejo es que nos aseguremos de que:</p>



<ol class="wp-block-list"><li>No es un bug en nuestro script el que crea la necesidad de ampliar este tiempo.</li><li>Nuestro script está razonablemente optimizado.</li></ol>



<p>Es decir, nada que no debamos hacer con cualquier otro script que no supere el tiempo de ejecución máximo. </p>



<h2 class="wp-block-heading">Cómo aumentar el límite el tiempo de ejecución de un script PHP</h2>



<p>Por defecto, el tiempo máximo de ejecución de un script es de 30 segundos. Si ya tenemos claro que queremos aumentar este tiempo podemos hacerlo de varias formas.</p>



<h3 class="wp-block-heading">Con la función set_time_limit()</h3>



<p>Utilizaremos esta función al comienzo de nuestro script definiendo el tiempo máximo de ejecución en segundos. Por lo tanto, con este método el nuevo limite afectará única y exclusivamente al script dónde lo utilicemos.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: php; title: ; notranslate">
&lt;?php

set_time_limit(60);

...

?&gt;
</pre></div>


<p>Debemos puntualizar que en caso de que estemos utilizando php en modo seguro esta función no tendrá ningún efecto.</p>



<h3 class="wp-block-heading">Con la función init_set()</h3>



<p>Este sistema funciona exactamente igual que <em>set_time_limit()</em>, con la única diferencia que utilizaremos la función <em>init_set() </em>pasando el string <em>max_execution_time </em>como primer parámetro.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: php; title: ; notranslate">
&lt;?php

ini_set(&#039;max_execution_time&#039;, 60);

...

?&gt;
</pre></div>


<h3 class="wp-block-heading">En el archivo php.ini</h3>



<p>En este caso, la principal diferencia entre este método y los dos anteriores es que el nuevo límite afectará a todos los scripts PHP que se ejecuten en el servidor dónde apliquemos esta configuración. Para aplicarlo, buscamos la directriz <em>max_execution_time,</em> dentro de la sección <em>Resources Limits</em>, en el archivo <em>php.ini</em> y modificamos su valor.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; gutter: false; title: ; notranslate">
;;;;;;;;;;;;;;;;;;;
; Resource Limits ;
;;;;;;;;;;;;;;;;;;;

; Maximum execution time of each script, in seconds
; http://php.net/max-execution-time
; Note: This directive is hardcoded to 0 for the CLI SAPI
max_execution_time = 60

</pre></div>


<p>Y acto seguido reiniciamos el servidor Apache 2 para que los cambios surtan efecto.:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
sudo service apache2 restart
</pre></div>


<p>La ubicación del archivo <em>php.ini </em>variará en función del sistema que estemos utilizando. En los sistemas Linux basados en Debian como Ubuntu la ubicación será <em>/etc/php/X.X/apache2</em>, donde X.X será la versión de PHP.</p>



<h3 class="wp-block-heading">En el archivo .htaccess</h3>



<p>Esta es quizás la opción menos conocida de las que mostramos en esta entrada, pero es una de las más interesante en cuanto a que podemos conseguir que la nueva directriz aplique a todos los scripts cuando no tenemos acceso al archivo <em>php.ini</em>.</p>



<p>Para aplicar este sistema editaremos el archivo <em>.htaccess </em>que nos interese incluyendo las siguientes líneas:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; gutter: false; title: ; notranslate">
&amp;lt;IfModule mod_php7.c&gt;
php_value max_execution_time 60
&amp;lt;/IfModule&gt;
</pre></div>


<p>Si nuestro servidor utiliza una versión 5.X de PHP en lugar de una versión 7.X, solo habría que cambiar <em>mod_php7.c</em> por <em>mod_php5.c</em>.</p>





<h2 class="wp-block-heading">Cómo comprobar el valor de tiempo máximo de ejecución</h2>



<p>Podemos comprobar el valor de tiempo máximo de ejecución configurado en nuestro servidor en la sección <em>Core </em>de la salida de la función <em>phpinfo()</em>:</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="422" height="129" src="https://blog.ahierro.es/wp-content/uploads/2019/07/max_execution_time.png" alt="max_execution_time phpinfo()" class="wp-image-1548" srcset="https://blog.ahierro.es/wp-content/uploads/2019/07/max_execution_time.png 422w, https://blog.ahierro.es/wp-content/uploads/2019/07/max_execution_time-300x92.png 300w" sizes="auto, (max-width: 422px) 100vw, 422px" /></figure>



<p>O como acabamos de ver, accediendo al archivo de configuración php.ini:</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="469" height="143" src="https://blog.ahierro.es/wp-content/uploads/2019/07/max_execution_time_vim.png" alt="max_execution_time en php.ini" class="wp-image-1535" srcset="https://blog.ahierro.es/wp-content/uploads/2019/07/max_execution_time_vim.png 469w, https://blog.ahierro.es/wp-content/uploads/2019/07/max_execution_time_vim-300x91.png 300w" sizes="auto, (max-width: 469px) 100vw, 469px" /></figure>



<h2 class="wp-block-heading">Créditos, referencias y artículos relacionados</h2>



<ul class="wp-block-list"><li>Imagen de portada: <a rel="noreferrer noopener" aria-label="Michael Jarmoluk (abre en una nueva pestaña)" href="https://pixabay.com/users/jarmoluk-143740/" target="_blank">Michael Jarmoluk</a></li><li><a rel="noreferrer noopener" aria-label="Documentación de la función php_time_limit() (abre en una nueva pestaña)" href="https://www.php.net/manual/es/function.set-time-limit.php" target="_blank">Documentación de la función php set_time_limit()</a></li><li><a rel="noreferrer noopener" aria-label="Documentación de la función init_set() (abre en una nueva pestaña)" href="https://www.php.net/manual/es/function.ini-set.php" target="_blank">Documentación de la función php init_set()</a></li><li><a href="https://blog.ahierro.es/servidor-web-en-raspberry-pi-y-ubuntu-mate/">Servidor Web en Raspberry PI y Ubuntu Mate</a></li><li><a href="https://blog.ahierro.es/como-configurar-virtual-hosts-en-apache-y-ubuntu/">Como configurar Virtual Hosts en Apache 2 y Ubuntu</a></li><li><a href="https://blog.ahierro.es/habilitar-modulos-en-apache-2-sobre-ubuntu/">Habilitar módulos en Apache 2 sobre Ubuntu</a></li></ul>La entrada <a href="https://blog.ahierro.es/aumentar-el-limite-de-tiempo-maximo-de-ejecucion-de-un-script-en-php/">Aumentar el limite de tiempo maximo de ejecución de un script en PHP</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.ahierro.es/aumentar-el-limite-de-tiempo-maximo-de-ejecucion-de-un-script-en-php/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Habilitar módulos en Apache 2 sobre Ubuntu</title>
		<link>https://blog.ahierro.es/habilitar-modulos-en-apache-2-sobre-ubuntu/</link>
					<comments>https://blog.ahierro.es/habilitar-modulos-en-apache-2-sobre-ubuntu/#comments</comments>
		
		<dc:creator><![CDATA[Andres]]></dc:creator>
		<pubDate>Mon, 22 Jul 2019 06:39:40 +0000</pubDate>
				<category><![CDATA[Servicios]]></category>
		<category><![CDATA[Sistemas]]></category>
		<category><![CDATA[Tips & Quick Wins]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[ubuntu]]></category>
		<guid isPermaLink="false">https://blog.ahierro.es/?p=1491</guid>

					<description><![CDATA[<p>En realidad esta entrada iba a tratar sobre cómo habilitar el módulo mod_rewrite en Apache 2, cosa que no tiene mucho sentido pues ya (casi) siempre viene habilitado por defecto al instalar Apache. Así que puestos a escribir sobre habilitar módulos, y dado que es una tarea bastante habitual habitual cuando instalamos un nuevo servidor &#8230; </p>
<p class="link-more"><a href="https://blog.ahierro.es/habilitar-modulos-en-apache-2-sobre-ubuntu/" class="more-link">Continuar leyendo<span class="screen-reader-text"> "Habilitar módulos en Apache 2 sobre Ubuntu"</span></a></p>
La entrada <a href="https://blog.ahierro.es/habilitar-modulos-en-apache-2-sobre-ubuntu/">Habilitar módulos en Apache 2 sobre Ubuntu</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></description>
										<content:encoded><![CDATA[<p>En realidad esta entrada iba a tratar sobre cómo habilitar el módulo mod_rewrite en Apache 2, cosa que no tiene mucho sentido pues ya (casi) siempre viene habilitado por defecto al instalar Apache.</p>



<p>Así que puestos a escribir sobre habilitar módulos, y dado que es una tarea bastante habitual habitual cuando instalamos un nuevo servidor web, o incluso cuando instalamos algunos paquetes de software sobre un servidor web existente, decidí escribir esta entrada más generalista.</p>



<figure class="wp-block-image is-resized"><img loading="lazy" decoding="async" src="https://blog.ahierro.es/wp-content/uploads/2019/07/habilitar.png" alt="Habilitar modulos Apache" class="wp-image-1493" width="840" height="330"/></figure>



<span id="more-1491"></span>



<p>Y es que en la actualidad, en una instalación estándar de Apache 2 sobre Ubuntu 18 se instalan más de 100 módulos, de los cuales sólo hay activos algo más de una veintena.</p>



<h2 class="wp-block-heading">Habilitar módulos</h2>



<p>Lejos quedan los tiempos en los que para habilitar módulos de Apache teníamos que editar el archivo <em>apache.conf</em>, tarea que generalmente no consistía más que en descomentar alguna línea. Hoy basta con ejecutar el comando <em>a2enmod</em> y reiniciar el servidor:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
sudo a2enmod modulo
sudo service apache2 restart
</pre></div>


<p>Pero descubramos que hay detrás de de este comando.</p>



<p>Los módulos disponibles por Apache 2 se encuentran dentro del directorio <em>/etc/apache2/mods-available/</em>. Lo que quiere decir que si el módulo que queremos habilitar no se encuentra ahí tendremos que copiarlo  y asignarle los permisos adecuados.</p>





<p>Por otro lado, los módulos habilitados se encuentran en el directorio <em>/etc/apache2/mods-enabled/</em>. Pero en este caso en lugar de encontrar archivos, encontraremos enlaces simbólicos a los archivos situados en la carpeta <em>/etc/apache2/mods-available/</em>. Así que una alternativa al comando <em>a2enmod</em> es el comando <em>ln</em>:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
sudo ln -s /etc/apache2/mods-available/modulo /etc/apache2/mods-enabled/modulo
sudo service apache2 restart
</pre></div>


<h2 class="wp-block-heading">Deshabilitar módulos</h2>



<p> Y para deshabilitar módulos la operación es muy similar, con la salvedad de que en lugar de utilizar el comando <em>a2enmod</em> utilizaremos el comando <em>a2dismod</em>:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
sudo a2dismod modulo
sudo service apache2 restart
</pre></div>


<p>O simplemente eliminaremos el enlace simbólico:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
sudo rm /etc/apache2/mods-enabled/modulo
sudo service apache2 restart
</pre></div>


<h2 class="wp-block-heading">Comprobaciones y logs de errores</h2>



<p>Podemos saber si un módulo se ha instalado correctamente revisando la salida de la función phpinfo() de php, en la sección apache2handler.</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="943" height="334" src="https://blog.ahierro.es/wp-content/uploads/2019/07/phpinfo_apache_modules.png" alt="phpinfo Modulos de Apache" class="wp-image-1503" srcset="https://blog.ahierro.es/wp-content/uploads/2019/07/phpinfo_apache_modules.png 943w, https://blog.ahierro.es/wp-content/uploads/2019/07/phpinfo_apache_modules-300x106.png 300w, https://blog.ahierro.es/wp-content/uploads/2019/07/phpinfo_apache_modules-768x272.png 768w" sizes="auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px" /></figure>



<p>Y en caso de experimentar cualquier tipo de problema, el primer lugar dónde consultar qué está ocurriendo son los logs de error de Apache 2, en el archivo  <em>/var/log/apache2/error.log</em>.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
cat /var/log/apache2/error.log
</pre></div>


<h2 class="wp-block-heading">Créditos, referencias y artículos relacionados</h2>



<ul class="wp-block-list"><li>Imagen de portada por <a href="https://pixabay.com/users/stockertui-12831137/" target="_blank" rel="noreferrer noopener" aria-label=" (abre en una nueva pestaña)">Wichan Yodsawai</a>.</li><li><a href="https://blog.ahierro.es/servidor-web-en-raspberry-pi-y-ubuntu-mate/">Servidor Web en Raspberry PI y Ubuntu Mate</a>.</li><li><a href="https://blog.ahierro.es/como-configurar-virtual-hosts-en-apache-y-ubuntu/">Como configurar Virtual Hosts en Apache 2 y Ubuntu</a>.</li><li><a href="https://blog.ahierro.es/archivos-y-permisos-de-usuario-en-apache-y-linux/">Archivos y permisos de usuario en Apache 2 y Linux</a>.</li></ul>La entrada <a href="https://blog.ahierro.es/habilitar-modulos-en-apache-2-sobre-ubuntu/">Habilitar módulos en Apache 2 sobre Ubuntu</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.ahierro.es/habilitar-modulos-en-apache-2-sobre-ubuntu/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
	</channel>
</rss>
