<?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>php | ahierro.es</title>
	<atom:link href="https://blog.ahierro.es/tag/php/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.7.2</generator>

<image>
	<url>https://blog.ahierro.es/wp-content/uploads/2018/10/cropped-logo_small-1-2-32x32.png</url>
	<title>php | 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>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>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 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>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>Clonar una web en un servidor local</title>
		<link>https://blog.ahierro.es/clonar-una-web-en-un-servidor-local/</link>
					<comments>https://blog.ahierro.es/clonar-una-web-en-un-servidor-local/#respond</comments>
		
		<dc:creator><![CDATA[Andres]]></dc:creator>
		<pubDate>Thu, 06 Jun 2019 05:34:58 +0000</pubDate>
				<category><![CDATA[Sistemas]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[ftp]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[php]]></category>
		<guid isPermaLink="false">https://blog.ahierro.es/?p=900</guid>

					<description><![CDATA[<p>Independientemente de los distintos entornos de desarrollo que podamos tener configurados, en muchas ocasiones es tremendamente util disponer de una copia exacta de nuestra web de producción en otro servidor local o remoto. Y cuando hablamos de «una copia exacta», queremos decir que tanto archivos como bases de datos estén perfectamente actualizados. Esto es muy &#8230; </p>
<p class="link-more"><a href="https://blog.ahierro.es/clonar-una-web-en-un-servidor-local/" class="more-link">Continuar leyendo<span class="screen-reader-text"> "Clonar una web en un servidor local"</span></a></p>
La entrada <a href="https://blog.ahierro.es/clonar-una-web-en-un-servidor-local/">Clonar una web en un servidor local</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>Independientemente de los distintos <a href="https://blog.ahierro.es/entornos-en-el-desarrollo-de-software/">entornos de desarrollo</a> que podamos tener configurados, en muchas ocasiones es tremendamente util disponer de una copia exacta de nuestra web de producción en otro servidor local o remoto.</p>



<p>Y cuando hablamos de «una copia exacta», queremos decir que tanto archivos como bases de datos estén perfectamente actualizados. Esto es muy útil para realizar pruebas de todo tipo: nuevos plugins, cambios de configuración, revisión de actualizaciones, etc.</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="650" height="438" src="https://blog.ahierro.es/wp-content/uploads/2019/05/clonar_web.png" alt="Conar Web" class="wp-image-927" srcset="https://blog.ahierro.es/wp-content/uploads/2019/05/clonar_web.png 650w, https://blog.ahierro.es/wp-content/uploads/2019/05/clonar_web-300x202.png 300w" sizes="auto, (max-width: 650px) 100vw, 650px" /></figure>



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



<p>Realizar esta tarea manualmente es tedioso, aburrido y consume mucho tiempo, eso sin contar que es probable que cuando nos propongamos realizar nuestras pruebas este entorno esté desactualizado, alterado por las últimas pruebas realizadas, o lo que es aún peor, no esté disponible. Así que una buena idea es automatizar esta tarea y programar su ejecución con la periodicidad que nos interese.</p>



<h2 class="wp-block-heading">Algunos aspectos relativos al clonado</h2>



<h3 class="wp-block-heading">Resumen del proceso</h3>



<p>Es buena idea tener una visión general del proceso antes de adentrarnos en él. Lo que vamos a hacer básicamente es un proceso ETL  (Extract, Transform, Load) manual.</p>



<p>Como parte del proceso de extracción realizaremos una copia de seguridad de la base de datos y la descargaremos a una ubicación intermedia. Haremos lo mismo con los archivos del servidor.</p>





<p>Una vez tenemos todo lo necesario en nuestro servidor local, modificamos algunos datos como son archivos de configuración o los registros en la base de datos relativos al entorno.</p>



<p>Finalmente restauraremos la base de datos y sobrescribiremos los archivos de nuestro servidor local.</p>



<h3 class="wp-block-heading">Local versus Remoto</h3>



<p>A pesar de que cada una de las tareas que realizaremos no son complicadas por si mismas, alternaremos de host continuamente y eso puede generar alguna confusión, así que para seguir los pasos indicados sin error deberemos estar muy  atentos al host en el que se realizan las distintas acciones. Identificaremos los hosts como «remoto», el servidor de producción que queremos clonar, y «local» el servidor de pruebas dónde queremos tener la copia.</p>



<p>Es importante que las versiones de <a href="https://blog.ahierro.es/servidor-web-en-raspberry-pi-y-ubuntu-mate/">LAMP (Linux, Apache, PHP y MySQL) </a>sean lo más similar posible, de este modo es posible que nos ahorraremos algunos quebraderos de cabeza. Además, es recomendable dedicar un <a href="https://blog.ahierro.es/como-configurar-virtual-hosts-en-apache-y-ubuntu/">virtual host de Apache </a>para este entorno en nuestro servidor local.</p>



<h3 class="wp-block-heading">Ejemplo sobre WordPress</h3>



<p>Y ya que estas líneas que lees están escritas sobre WordPress, utilizaremos esta plataforma como ejemplo para realizar el clonado. Esto quiere decir que por norma general, si queréis clonar otra plataforma, las mayores diferencias las encontraremos en los los registros de la base de datos y los archivos de configuración referentes al entorno.</p>



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



<p>Como hemos dicho queremos automatizar el clonado de nuestra web para tener nuestra réplica preparada y actualizada en todo momento. Podemos establecer la periodicidad que más nos convenga, personalmente estoy cómodo con una semana por dos motivos:</p>



<ol class="wp-block-list"><li>En una semana no suelen producirse muchos cambios en el blog.</li><li>Algunas pruebas se extienden durante varios días, y una restauración diaria las sobrescribiría.</li></ol>



<p>Además, siempre estamos a tiempo de lanzar una actualización manual en caso de ser necesario con la simple ejecución de un script. Si no tienes una web muy grande el proceso será relativamente rápido.</p>



<h2 class="wp-block-heading">Requisitos hardware</h2>



<p>En cuanto a los requisitos de hardware puedes estar tranquilo, pues no necesitas un gran servidor para implementar este sistema. Un ejemplo muy claro de ello es que para este blog lo tengo implementado con una humilde Raspberry Pi. Por si te interesa, aquí te dejo un enlace en el que puedes ver cómo de sencillo es <a href="https://blog.ahierro.es/servidor-web-en-raspberry-pi-y-ubuntu-mate/">montar un servidor web Apache sobre una Raspberry Pi</a>.</p>



<h2 class="wp-block-heading">Clonando nuestra web: el proceso</h2>



<p>Llegados a este punto creo que al igual que yo ya tendréis ganas de poneros manos a la obra, así que no me enrollo más y vamos al lío.</p>



<p>Y puesto que esto se ha alargado un poco más de la cuenta, hemos dividido este artículo en varias entregas para que sea más fácil de seguir:</p>



<ol class="wp-block-list"><li>Clonar una web en un servidor local (es decir, esta entrada).</li><li><a href="https://blog.ahierro.es/clonar-una-web-la-base-de-datos/">Clonar una web: la base de datos</a>.</li><li><a href="https://blog.ahierro.es/clonar-una-web-los-archivos/">Clonar una web: los archivos</a>.</li></ol>



<h2 class="wp-block-heading">Créditos y referencias</h2>



<ul class="wp-block-list"><li>Imagen de portada: <a rel="noreferrer noopener" href="https://pixabay.com/users/martinharry-1411929/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=941625" target="_blank">Martin Harry</a>.</li></ul>





<p></p>La entrada <a href="https://blog.ahierro.es/clonar-una-web-en-un-servidor-local/">Clonar una web en un servidor local</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/clonar-una-web-en-un-servidor-local/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Backup de base de datos MySQL con PHP</title>
		<link>https://blog.ahierro.es/backup-de-base-de-datos-mysql-con-php/</link>
					<comments>https://blog.ahierro.es/backup-de-base-de-datos-mysql-con-php/#respond</comments>
		
		<dc:creator><![CDATA[Andres]]></dc:creator>
		<pubDate>Sun, 19 May 2019 08:42:36 +0000</pubDate>
				<category><![CDATA[Bases de Datos]]></category>
		<category><![CDATA[Desarrollo Web]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[php]]></category>
		<guid isPermaLink="false">https://blog.ahierro.es/?p=905</guid>

					<description><![CDATA[<p>Existen múltiples opciones para exportar o realizar copias de seguridad de bases de datos en MySQL: phpMyAdmin, MySQL Workbench, utilizando la línea de comandos, etc. Si nos referimos a una página web, podremos hacer uso de unas u otras en función de las posibilidades que nos ofrezca nuestro proveedor de hosting. Otra de esas posibilidades &#8230; </p>
<p class="link-more"><a href="https://blog.ahierro.es/backup-de-base-de-datos-mysql-con-php/" class="more-link">Continuar leyendo<span class="screen-reader-text"> "Backup de base de datos MySQL con PHP"</span></a></p>
La entrada <a href="https://blog.ahierro.es/backup-de-base-de-datos-mysql-con-php/">Backup de base de datos MySQL con 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>Existen múltiples opciones para exportar o realizar copias de seguridad de bases de datos en MySQL: phpMyAdmin, MySQL Workbench, utilizando la línea de comandos, etc. Si nos referimos a una página web, podremos hacer uso de unas u otras en función de las posibilidades que nos ofrezca nuestro proveedor de hosting.</p>



<p>Otra de esas posibilidades de las que hablamos es realizar el respaldo con PHP, lo que nos permitirá hacerlo con casi todos los hostings, además de que es fácilmente automatizable. La principal desventaja, por contra, es que es una opción algo más laboriosa, pues tendremos que programar el script. Pero como la rueda casi siempre está inventada, en internet tienes muchas soluciones que te facilitarán la labor.</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="650" height="438" src="https://blog.ahierro.es/wp-content/uploads/2019/05/backup_mysql.png" alt="Backup base de datos Mysql" class="wp-image-929" srcset="https://blog.ahierro.es/wp-content/uploads/2019/05/backup_mysql.png 650w, https://blog.ahierro.es/wp-content/uploads/2019/05/backup_mysql-300x202.png 300w" sizes="auto, (max-width: 650px) 100vw, 650px" /></figure>



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



<h2 class="wp-block-heading">MySQL BackUp Lite</h2>



<p>Yo os propongo esta sencilla solución que he desarrollado, de la que os dejo el código a continuación. En cualquier momento puedes acceder a <a rel="noreferrer noopener" aria-label="la versión más actualizada en Github (abre en una nueva pestaña)" href="https://github.com/ahierrohdez/MySqlBackupLite" target="_blank">la versión más actualizada de MySQL Backup Lite en Github</a>.</p>




<div class="wp-block-syntaxhighlighter-code "><pre class="brush: php; title: ; notranslate">
/**
*
* MySql Backup Lite Class
*
* @author     Andres Hierro
* @copyright  2019 Andres Hierro
* @license    http://www.apache.org/licenses/LICENSE-2.0  Apache License, Version 2.0
* @version    0.0.1
* @link       http://ahierro.es/
*
*
*
* Copyright 2019 Andrés Hierro
*
* Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/

class MySqlBackupLite {

  private $host;
  private $user;
  private $pass;
  private $name;

  private $fileName = &quot;mySqlBackup.sql&quot;;
  private $fileDir = &quot;./&quot;;
  private $fileCompression = false;

  private $timeZone = &#039;+00:00&#039;;

  private $mySqli;
  private $sqlString = &quot;&quot;;
  private $arrayTables;

  private $tableFieldCount = 0;
  private $tableNumberOfRows = 0;
  private $queryResult;



  public function __construct(array $arrayConnConfig) {

      if (
        (!isset($arrayConnConfig&#x5B;&#039;host&#039;])) ||
        (!isset($arrayConnConfig&#x5B;&#039;user&#039;])) ||
        (!isset($arrayConnConfig&#x5B;&#039;pass&#039;])) ||
        (!isset($arrayConnConfig&#x5B;&#039;name&#039;]))
      ) {
          throw new Exception(&#039;Missing connection data.&#039;);

      }
      $this-&gt;setHost($arrayConnConfig&#x5B;&#039;host&#039;]);
      $this-&gt;setUser($arrayConnConfig&#x5B;&#039;user&#039;]);
      $this-&gt;setPass($arrayConnConfig&#x5B;&#039;pass&#039;]);
      $this-&gt;setName($arrayConnConfig&#x5B;&#039;name&#039;]);

  }



  public function backUp() {

    $this-&gt;connectMySql();
    $this-&gt;getTables();
    $this-&gt;generateSqlHeader();
    $this-&gt;createTableStaments();
    $this-&gt;insertStaments();
    $this-&gt;generateSqlFooter();

  }



  private function setHost($host) {
    $this-&gt;host = $host;
  }



  private function setUser($user) {
    $this-&gt;user = $user;
  }



  private function setPass($password) {
    $this-&gt;pass = $password;
  }



  private function setName($name) {
    $this-&gt;name = $name;
  }



  public function setFileName($name) {
    $this-&gt;fileName = $name;
  }



  public function setFileDir($dir) {
    $this-&gt;fileDir = $dir;
  }



  public function setFileCompression($compression) {
    $this-&gt;fileCompression = $compression;
  }



  private function connectMySql() {

    $this-&gt;mySqli = new mysqli($this-&gt;host, $this-&gt;user, $this-&gt;pass, $this-&gt;name);
    $this-&gt;mySqli-&gt;select_db($this-&gt;name);
    $this-&gt;mySqli-&gt;query(&quot;SET NAMES &#039;utf8&#039;&quot;);

  }



  private function getTables() {

    $queryTables = $this-&gt;mySqli-&gt;query(&#039;SHOW TABLES&#039;);
    while($row = $queryTables-&gt;fetch_row()) {
      $this-&gt;arrayTables&#x5B;] = $row&#x5B;0];
    }

  }



  private function generateSqlHeader() {

    $this-&gt;sqlString  = &#039;SET SQL_MODE = &quot;NO_AUTO_VALUE_ON_ZERO&quot;;&#039; . &quot;\r\n&quot;;
    $this-&gt;sqlString .= &#039;SET time_zone = &quot;&#039; . $this-&gt;timeZone . &#039;&quot;;&#039; . &quot;\r\n\r\n\r\n&quot;;
    $this-&gt;sqlString .= &#039;/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;&#039; . &quot;\r\n&quot;;
    $this-&gt;sqlString .= &#039;/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;&#039; . &quot;\r\n&quot;;
    $this-&gt;sqlString .= &#039;/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;&#039; . &quot;\r\n&quot;;
    $this-&gt;sqlString .= &#039;/*!40101 SET NAMES utf8 */;&#039; . &quot;\r\n&quot;;
    $this-&gt;sqlString .= &#039;--&#039; . &quot;\r\n&quot;;
    $this-&gt;sqlString .= &#039;-- Database: `&#039; . $this-&gt;name . &#039;`&#039; . &quot;\r\n&quot;;
    $this-&gt;sqlString .= &#039;--&#039; . &quot;\r\n\r\n\r\n&quot;;

    return;

  }



  private function createTableStaments() {

    foreach($this-&gt;arrayTables as $table){
      $this-&gt;sqlCreateTableStament($table);
    }

  }



  private function sqlCreateTableStament($table) {

    $res = $this-&gt;mySqli-&gt;query(&#039;SHOW CREATE TABLE &#039;.$table);
    $temp = $res-&gt;fetch_row();
		$this-&gt;sqlString .= &quot;\n\n&quot; . str_ireplace(&#039;CREATE TABLE `&#039;,&#039;CREATE TABLE IF NOT EXISTS `&#039;, $temp&#x5B;1]) . &quot;;\n\n&quot;;

  }



  private function insertStaments() {

    foreach($this-&gt;arrayTables as $table){
      $this-&gt;sqlInsertStaments($table);
    }

  }



  private function sqlInsertStaments($table) {

		$this-&gt;getTableData($table);

    if($this-&gt;tableFieldCount == 0) {
      return;
    }


    $i = 0;
		while($row = $this-&gt;queryResult-&gt;fetch_row())	{

      $this-&gt;insertResultHeader($table, $i);
      $this-&gt;insertSingleResult($row);

      $i++;
      $this-&gt;sqlString .= (($i != 0) &amp;&amp; ($i % 100 == 0) || ($i == $this-&gt;tableNumberOfRows)) ? &quot;;&quot; : &quot;,&quot;;

		}

    $this-&gt;sqlString .= &quot;\n\n\n&quot;;

  }



  private function getTableData($table) {

  	$this-&gt;queryResult	= $this-&gt;mySqli-&gt;query(&#039;SELECT * FROM `&#039; . $table . &#039;`&#039;);
    $this-&gt;tableFieldCount = $this-&gt;queryResult-&gt;field_count;
    $this-&gt;tableNumberOfRows = $this-&gt;mySqli-&gt;affected_rows;

  }



  private function insertResultHeader($table, $currentRowNumber) {

  	if ($currentRowNumber % 100 == 0 || $currentRowNumber == 0 )	{
      $this-&gt;sqlString .= &quot;\nINSERT INTO &quot; . $table . &quot; VALUES&quot;;
    }

  }



  private function insertSingleResult($row) {

    $this-&gt;sqlString .= &quot;\n(&quot;;

    for($i = 0; $i &lt; $this-&gt;tableFieldCount; $i++){

      $row&#x5B;$i] = str_replace(&quot;\n&quot;,&quot;\\n&quot;, addslashes($row&#x5B;$i]));

      $this-&gt;sqlString .= (isset($row&#x5B;$i])) ? &#039;&quot;&#039;.$row&#x5B;$i].&#039;&quot;&#039; : &#039;&quot;&quot;&#039;;
      if($i &lt; ($this-&gt;tableFieldCount-1)){
        $this-&gt;sqlString.= &#039;,&#039;;
      }

    }

    $this-&gt;sqlString .=&quot;)&quot;;

  }



  private function generateSqlFooter() {

    $this-&gt;sqlString .=  &quot;\r\n\r\n&quot;;
    $this-&gt;sqlString .=  &#039;/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;&#039;;
    $this-&gt;sqlString .=  &quot;\r\n&quot;;
    $this-&gt;sqlString .=  &#039;/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;&#039;;
    $this-&gt;sqlString .=  &quot;\r\n&quot;;
    $this-&gt;sqlString .=  &#039;/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;&#039;;

  }



  public function downloadFile() {

      ob_get_clean();
      header(&#039;Content-Type: application/octet-stream&#039;);
      header(&quot;Content-Transfer-Encoding: Binary&quot;);
      header(&#039;Content-Length: &#039;. (function_exists(&#039;mb_strlen&#039;) ? mb_strlen($this-&gt;sqlString, &#039;8bit&#039;): strlen($this-&gt;sqlString)) );
      header(&quot;Content-disposition: attachment; filename=\&quot;&quot;.$this-&gt;fileName.&quot;\&quot;&quot;);
    	echo $this-&gt;sqlString; exit;

  }



  public function saveToFile() {

    if (!$backupFile = fopen($this-&gt;fileDir . $this-&gt;fileName, &quot;w+&quot;)) {
        throw new Exception(&#039;Imposible to create file.&#039;);
    }
    fwrite($backupFile, $this-&gt;sqlString);
    fclose($backupFile);

  }


}
</pre></div>


<h2 class="wp-block-heading">Realizar la copia de seguridad</h2>



<p>La solución propuesta nos proporciona dos opciones que podemos utilizar según nuestras necesidades:</p>



<ol class="wp-block-list"><li>Realizar el backup y descargarlo.</li><li>Realizar el backup y guardarlo en un archivo.</li></ol>



<p>En ambos casos incluimos la clase y le pasaremos al método constructor los datos de la conexión a la base de datos en un array como el que ves a continuación:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: php; title: ; notranslate">
include(&#039;MySqlBackup.php&#039;);

$arrayDbConf&#x5B;&#039;host&#039;] = &#039;dbHost&#039;;
$arrayDbConf&#x5B;&#039;user&#039;] = &#039;dbUser&#039;;
$arrayDbConf&#x5B;&#039;pass&#039;] = &#039;dbPassword&#039;;
$arrayDbConf&#x5B;&#039;name&#039;] = &#039;dbName&#039;;
</pre></div>


<h3 class="wp-block-heading">Respaldar y descargar</h3>



<p>Para realizar el backup y descargarlo serán suficientes unas pocas líneas:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: php; title: ; notranslate">
try {

  $bck = new MySqlBackupLite($arrayDbConf);
  $bck-&gt;backUp();
  $bck-&gt;downloadFile();

}
catch(Exception $e) {

  echo $e;

}
</pre></div>


<h3 class="wp-block-heading">Respaldar y guardar en un archivo</h3>



<p>Para guardar el resultado en un archivo además deberemos de indicarle el nombre del archivo y el directorio dónde guardarlo.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: php; title: ; notranslate">
try {

  $bck = new MySqlBackupLite($arrayDbConf);
  $bck-&gt;backUp();
  $bck-&gt;setFileDir(&#039;./backups/&#039;);
  $bck-&gt;setFileName(&#039;backupFileNae.sql&#039;);
  $bck-&gt;saveToFile();

}
catch(Exception $e) {

  echo $e;

}
</pre></div>


<h2 class="wp-block-heading">Solo una parte del proceso</h2>



<p>Pero en muchas situaciones, este respaldo sera solo una parte del proceso. Nosotros hemos propuesto un escenario mayor en el que clonamos nuestra web en un servidor local, en breve publicaremos el artículo.</p>





<h2 class="wp-block-heading">Créditos y rerefencias</h2>



<ul class="wp-block-list"><li>Imagen principal: <a rel="noreferrer noopener" aria-label="Tumisu (abre en una nueva pestaña)" href="https://pixabay.com/users/tumisu-148124/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=1990406" target="_blank">Tumisu en Pixabay</a>.</li><li>Solución <a rel="noreferrer noopener" aria-label="Mysql Backup Lite: Andrés Hierro, github (abre en una nueva pestaña)" href="https://github.com/ahierrohdez/MySqlBackupLite" target="_blank">Mysql Backup Lite: Andrés Hierro, github</a>.</li></ul>La entrada <a href="https://blog.ahierro.es/backup-de-base-de-datos-mysql-con-php/">Backup de base de datos MySQL con 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/backup-de-base-de-datos-mysql-con-php/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Servidor Web en Raspberry PI y Ubuntu Mate</title>
		<link>https://blog.ahierro.es/servidor-web-en-raspberry-pi-y-ubuntu-mate/</link>
					<comments>https://blog.ahierro.es/servidor-web-en-raspberry-pi-y-ubuntu-mate/#respond</comments>
		
		<dc:creator><![CDATA[Andres]]></dc:creator>
		<pubDate>Mon, 10 Dec 2018 06:15:41 +0000</pubDate>
				<category><![CDATA[Servicios]]></category>
		<category><![CDATA[Sistemas]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[base de datos]]></category>
		<category><![CDATA[mariadb]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[phpmyadmin]]></category>
		<category><![CDATA[raspberry pi]]></category>
		<category><![CDATA[servidor]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[web]]></category>
		<guid isPermaLink="false">https://www.ahierro.es/?p=148</guid>

					<description><![CDATA[<p>Un servidor web Apache 2 corriendo sobre Linux no requiere muchos recursos de hardware. Así que si queremos disponer de un servidor casero dónde poder trastear y realizar pruebas o desarrollar ese pequeño proyecto que siempre nos ronda en la cabeza, una Raspberry Pi es una buena opción. Esta entrada forma parte de la serie &#8230; </p>
<p class="link-more"><a href="https://blog.ahierro.es/servidor-web-en-raspberry-pi-y-ubuntu-mate/" class="more-link">Continuar leyendo<span class="screen-reader-text"> "Servidor Web en Raspberry PI y Ubuntu Mate"</span></a></p>
La entrada <a href="https://blog.ahierro.es/servidor-web-en-raspberry-pi-y-ubuntu-mate/">Servidor Web en Raspberry PI y Ubuntu Mate</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>Un servidor web Apache 2 corriendo sobre Linux no requiere muchos recursos de hardware. Así que si queremos disponer de un servidor casero dónde poder trastear y realizar pruebas o desarrollar ese pequeño proyecto que siempre nos ronda en la cabeza, una Raspberry Pi es una buena opción.</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="650" height="365" src="https://www.ahierro.es/wp-content/uploads/2018/12/servidor_web.jpg" alt="Servidor web" class="wp-image-251" srcset="https://blog.ahierro.es/wp-content/uploads/2018/12/servidor_web.jpg 650w, https://blog.ahierro.es/wp-content/uploads/2018/12/servidor_web-300x168.jpg 300w, https://blog.ahierro.es/wp-content/uploads/2018/12/servidor_web-267x150.jpg 267w" sizes="auto, (max-width: 650px) 100vw, 650px" /></figure>



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



<p>Esta entrada forma parte de la serie <a href="https://www.ahierro.es/raspberry-pi-como-herramienta-de-apoyo-para-el-desarrollo-web/">Raspberry Pi como herramienta de apoyo al desarrollo web</a>, y está pensada para un servidor de uso personal. De cualquier manera, el contenido de esta guía es perfectamente aplicable a cualquier distribución de Linux basada en Ubuntu y a Raspbian.</p>





<p>Esta documento también puede utilizarse para la configuración de un servidor de una pequeña organización, en cuyo caso sería necesario tener en cuenta algunas consideraciones:</p>



<ol class="wp-block-list"><li>Una Rasperri Pi no es el hardware más adecuado. Debería instalarse sobre un hardware fiable y acordemente dimensionado a las necesidades del uso que se le dará.</li><li>Además del contenido de este artículo, deberían realizarse una serie de configuraciones extra enfocadas en la seguridad que no entran en el ámbito ni el alcance de este documento.</li><li>Este artículo esta pensado para la instalación y configuración de un servidor web en una red local, en caso de que el servidor sea accesible directamente desde internet, el punto anterior cobra mayor importancia, además de requerir algunos ajustes más.</li></ol>



<p>Una vez que todos tenemos claro el ámbito y el alcance, vamos al lío.</p>



<h3 class="wp-block-heading">Instalamos Apache 2</h3>



<p>Este paso será muy sencillo, actualizamos los repositorios e instalamos Apache 2:</p>


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


<p>Si todo ha ido bien ya podremos acceder al al servidor web desde cualquier pc conectado a la red local con tan solo introducir la ip en el navegador.</p>



<p>Para el resto de la entrada asumiremos que nuestra Raspberry está configurada con la IP estática 192.168.1.10.</p>



<p>Así que si introducimos en el navegador la dirección http://192.168.1.10&nbsp; veremos la página por defecto de Apache 2:</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="650" height="365" src="https://www.ahierro.es/wp-content/uploads/2018/12/apache2_default_page.jpg" alt="Apache 2 página por defecto" class="wp-image-256" srcset="https://blog.ahierro.es/wp-content/uploads/2018/12/apache2_default_page.jpg 650w, https://blog.ahierro.es/wp-content/uploads/2018/12/apache2_default_page-300x168.jpg 300w, https://blog.ahierro.es/wp-content/uploads/2018/12/apache2_default_page-267x150.jpg 267w" sizes="auto, (max-width: 650px) 100vw, 650px" /></figure>



<p>Un aspecto muy importante en la configuración de Apache es asignar los permisos adecuados a la carpeta del servidor. Podemos pasar sin hacerlo pero más pronto que tarde nos encontraremos con problemas relacionados con permisos.</p>





<p>Comenzaremos asegurándonos de que /var/www/html pertenezca al grupo www-data y que tiene los permisos adecuados:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
sudo chgrp www-data /var/www/html
sudo chmod 775 /var/www/html
sudo chmod g+s /var/www/html
</pre></div>


<p>Agregamos nuestro usuario al grupo www-data:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
sudo usermod -a -G www-data usuario
</pre></div>


<p>Y por último nos aseguramos de ser los propietarios del directorio</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
sudo chown usuario /var/www/html
</pre></div>


<p>Con esto hemos concluido la instalación de Apache.</p>



<h3 class="wp-block-heading">Instalamos PHP</h3>



<p>Instalamos PHP:</p>


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


<p>Es posible que en función de la distribución que utilicemos en lugar del paquete php7.0 encontremos otra versión. Podemos comprobarlo fácilmente con la siguiente orden:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
sudo apt-cache search php
</pre></div>


<p>Y si por cualquier motivo necesitamos una versión específica de php, deberemos incluir el repositorio ondrej/php como hacemos a continuación:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
sudo add-apt-repository -y ppa:ondrej/php
sudo apt-get update
</pre></div>


<p>En este caso he incluido la opción -y porque al intentar agregar el repositorio me mostraba un warning relacionado con la codificación de caracteres de los repositorios.</p>



<p>Acto seguido instalar la versión de php que necesitemos, en mi caso voy a instalar la versión 7.3:</p>


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


<p>Tras reiniciar Apache ya habremos acabado:</p>


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


<p>Para comprobar que php está correctamente instalado crearemos el archivo&nbsp; /var/www/html/phpinfo.php con el siguiente contenido:</p>


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


<p>Si todo es correcto al acceder a http://192.168.1.10/phpinfo.php veremos algo así:</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="650" height="365" src="https://www.ahierro.es/wp-content/uploads/2018/12/php_info_php73.jpg" alt="phpinfo php 7.3" class="wp-image-279" srcset="https://blog.ahierro.es/wp-content/uploads/2018/12/php_info_php73.jpg 650w, https://blog.ahierro.es/wp-content/uploads/2018/12/php_info_php73-300x168.jpg 300w, https://blog.ahierro.es/wp-content/uploads/2018/12/php_info_php73-267x150.jpg 267w" sizes="auto, (max-width: 650px) 100vw, 650px" /></figure>



<h3 class="wp-block-heading">Instalamos y configuramos MariaDB</h3>



<p>Una vez que php está instalado, continuamos con la base de datos:</p>


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


<p>Durante el proceso de instalación deberemos responder responder a algunas preguntas que sin complicación alguna.</p>



<p>El primer paso tras la instalación será configurar MariaDB para que podamos acceder remotamente, pues por defecto solo acepta conexiones desde el propio host:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
sudo vim /etc/mysql/mariadb.conf.d/50-server.cnf
</pre></div>


<p>Esfe archivo puede cambiar en función de tu distribución y de la versión de MariaDB. En ocasiones puedes encontrarlo en /etc/mysql/my.cnf, en /etc/mysql/mysql.conf.d/mysqld.cnf, etc.</p>



<p>Localizamos la siguiente línea:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; gutter: false; title: ; notranslate">
bind-address  = 127.0.0.1
</pre></div>


<p>La sustituimos por:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; gutter: false; title: ; notranslate">
bind-address  = 0.0.0.0
</pre></div>


<p>Y reiniciamos la base de datos:</p>


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


<p>Con esto hemos habilitado el acceso remoto a MariaDB. Ahora crearemos un nuevo usuario para evitar trabajar con root. Para ello accedemos a la consola de MariaDB:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
sudo mysql -u root -p
</pre></div>


<p>Una vez en la consola de MariaDB creamos nuestro usuario:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; gutter: false; title: ; notranslate">
CREATE USER &#039;usuario&#039; IDENTIFIED BY &#039;contraseña&#039;;
</pre></div>


<p>Y concedemos acceso remoto y a todas las bases de datos al usuario que acabamos de crear:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; gutter: false; title: ; notranslate">
GRANT USAGE ON *.* TO &#039;usuario&#039;@&#039;%&#039; IDENTIFIED BY &#039;contraseña&#039;;
</pre></div>


<p>En este punto es buena idea comprobar que todo ha salido bien. Podemos hacerlo abriendo una conexión al servidor de bases desde nuestro equipo de trabajo con alguna herramienta como MySQL Workbench.</p>



<h3 class="wp-block-heading">Instalamos phpMyAdmin</h3>



<p>Esta es una herramienta que siempre me gusta instalar a pesar de que en la mayoría de situaciones trabajo con MySql Workbenck. Para instalar basta con:</p>


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


<p>Y una vez instalado podremos acceder a ella mediante <em>http://192.168.1.10/phpmyadmin</em>.</p>





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



<p>Ya tenemos un servidor web completamente funcional corriendo sobre nuestra Rasperri PI, sencillo, económico y funcional. Ahora solo hay que usarlo.</p>



<p>¿Y tú?, ¿Crees que necesitamos aplicar alguna otra configuración? ¿Haces algo distinto? ¿Echas en falta algún paso? o simplemente ¿te ha servido de ayuda? Comparte tu experiencia y aprendamos todos.</p>La entrada <a href="https://blog.ahierro.es/servidor-web-en-raspberry-pi-y-ubuntu-mate/">Servidor Web en Raspberry PI y Ubuntu Mate</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/servidor-web-en-raspberry-pi-y-ubuntu-mate/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
