<?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>Rutarelativa &#187; Php</title>
	<atom:link href="http://www.rutarelativa.com/category/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.rutarelativa.com</link>
	<description>Porque la web es relativa</description>
	<lastBuildDate>Thu, 29 Jul 2010 11:32:33 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>¿Cómo puedo hacer ping XML-RPC con PHP?</title>
		<link>http://www.rutarelativa.com/php/como-puedo-hacer-ping-xml-rpc-php/</link>
		<comments>http://www.rutarelativa.com/php/como-puedo-hacer-ping-xml-rpc-php/#comments</comments>
		<pubDate>Thu, 06 May 2010 08:47:57 +0000</pubDate>
		<dc:creator>KeLDroX</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[Blogs]]></category>
		<category><![CDATA[Clientes]]></category>
		<category><![CDATA[Como]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Ping]]></category>
		<category><![CDATA[Servidores]]></category>
		<category><![CDATA[URL]]></category>
		<category><![CDATA[XML-RPC]]></category>

		<guid isPermaLink="false">http://www.rutarelativa.com/?p=547</guid>
		<description><![CDATA[Muchos de nosotros hemos escuchando alguna vez la palabra ping y que maravillosamente Wordpress los realiza por arte de magia tan solo incluyendo una URL en el apartado de configuración Servicios de actualización. Realizar ping a través de XML-RPC por ejemplo a blogalaxia.com, bitacoras.com, o incluso a Google avisan a estos sistema de que nuestro [...]]]></description>
			<content:encoded><![CDATA[<p>Muchos de nosotros hemos escuchando alguna vez la palabra <strong>ping</strong> y que maravillosamente <strong>Wordpress</strong> los realiza por arte de magia tan solo incluyendo una URL en el apartado de configuración <em>Servicios de actualización</em>. Realizar <strong>ping a través de XML-RPC</strong> por ejemplo a blogalaxia.com, bitacoras.com, o incluso a Google avisan a estos sistema de que nuestro blog se ha actualizado y que nos gustaría que pasaran a recoger la nueva información que hemos añadido.</p>
<p>Una buena práctica para que aparezcamos antes en Google es añadir a estos <strong>servicios de actualización</strong> la URL blogsearch de Google.</p>
<p><span id="more-547"></span></p>
<p>Todos los desarrolladores que no quieran utilizar <strong>Wordpress</strong> y crean mejor sus propios blogs o proyectos deben de tener en cuenta los <strong>ping XML-RPC</strong> para avisar de su nuevo contenido. Así que hoy he tenido que realizar una función que realice ping de forma automática como lo hace <strong>Wordpress</strong>. Para empezar buscaremos la función de <strong>Wordpress</strong> que se encarga los <strong>ping XML-RPC</strong> y la extraeremos y modificaremos a nuestro gusto. Empecemos:</p>
<h3>¿Que son los ping XML-RPC?</h3>
<p>Una forma clara de poder explicar los <strong>ping XML-RPC</strong> es imaginarse dos ordenadores, uno de ellos sera un cliente, nuestro caso es donde tenemos nuestro blog, y el ordenador un servidor que se encargara de recibir el ping. El ordenador cliente mandará una petición, comunicándose mediante Internet usando el estándar XML. El servidor ejecutará esta petición examinando que clase o método debe llamar para procesar la petición. Una vez terminado de ejecutar, el servidor enviará la respuesta hacia el cliente. Para más información puedes visitar la <a href="http://es.wikipedia.org/wiki/XML-RPC" title="¿Que son los ping XML-RPC?">Wikipedia</a></p>
<h3>¿Cómo puedo hacer ping XML-RPC con PHP?</h3>
<p>Una vez extraída la función <em>weblog_ping</em> de <strong>Wordpress</strong> implementarla para nuestros proyectos es realmente sencillo. Primero deberemos de descargar la librería encargada de realizar los <strong>ping XML-RPC</strong>, llamada IXR y su sitio oficial para descargar es <a href="http://scripts.incutio.com/xmlrpc/" title="Descargar IXR" rel="external nofollow">scripts.incutio</a>.</p>
<p>Cuando hayamos descargado la librería IXR la incluiremos en nuestro proyecto para poderla llamar desde nuestra propia función <em>weblog_ping</em>, que será la encargada de realizar los ping a las distintas URL. </p>
<pre class="php more"><code>function weblog_ping($server = "") 
{
	// Incluimos la clase IXR
	include_once ("class-IXR.php");

	// Realizamos la conexión con la URL
	$client = new IXR_Client($server, false);
	// Esperamos un tiempo de respuesta de 3 segundos
	$client-&gt;timeout = 3;
	// Useragent que queramos por el cual nos identifique el servidor, podeis poner cualquiera.
	$client-&gt;useragent .= " -- El useragent que queramos utilizar";

	// Deberemos decir False ya que si no nos mostrara toda la peticion desde que sale del cliente hasta la respuesta del cliente
	// Si teneis problemas habilitarla para ver que esta pasando
	$client-&gt;debug = false;

	// Ejecutamos la peticion al servidor indicando que deseamos que ejecute el procedimiento extendedPing del servidor, que sera el encargado de recorrer nuestra URL en busca de cambios
	if( $client-&gt;query("weblogUpdates.extendedPing", "El nombre de nuestro blog", "URL de nuestro blog", "URL de nuestro RSS" )
		echo "Servidor: " . $server . " OK";
	else
		echo "Servidor: " . $server . " ERROR";
}</code></pre>
<p>
<p>Finalmente para que nuestro blog llame a las distintas URL de servicios de actualización deberemos llamar a la función <em>weblog_ping</em> pasándole como argumento a que servidor queremos realizar el <strong>ping XML-RPC</strong>.</p>
<pre class="php"><code>// Ping a bitacoras
weblog_ping("http://ping.bitacoras.com");

// Ping a technorati
weblog_ping("http://rpc.technorati.com/rpc/ping");

// Ping a blogalaxia
weblog_ping("http://ping.blogalaxia.com");

// Ping a google
weblog_ping("http://blogsearch.google.com/ping/RPC2");</code></pre>
<p>
<p>Ya solo nos queda realizar por ejemplo una tabla con distintas URL de ping o un campo en una tabla opciones con varias URL y luego extraer la información de la base de datos y finalizarlo con un bucle para que llame a las distintas URL de forma dinámica. Pero ya estas pinceladas es a gusto de cada uno.</p>
<p>Más información: <a href="http://javieraroche.com/2006/07/26/ping-via-xml-rpc/" title="¿Como puedo hacer ping XML-RPC con PHP?" rel="external nofollow">Javieraroche</a> o <a href="http://www.blogterrier.com.ar/2009/02/pings-xml-rpc-con-php-y-en-castellano.html" title="Blogterrier" rel="external nofollow">blogterrier</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.rutarelativa.com/php/como-puedo-hacer-ping-xml-rpc-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Detectar la procedencia del usuario por la IP en PHP</title>
		<link>http://www.rutarelativa.com/php/detectar-procedencia-usuario-ip-php/</link>
		<comments>http://www.rutarelativa.com/php/detectar-procedencia-usuario-ip-php/#comments</comments>
		<pubDate>Fri, 23 Apr 2010 10:35:22 +0000</pubDate>
		<dc:creator>Sergiocius</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[Detectar]]></category>
		<category><![CDATA[Funciones]]></category>
		<category><![CDATA[Geolocalizacion]]></category>
		<category><![CDATA[IP]]></category>
		<category><![CDATA[Pais]]></category>
		<category><![CDATA[Procedencia]]></category>
		<category><![CDATA[Usuario]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.rutarelativa.com/?p=514</guid>
		<description><![CDATA[Si queremos detectar la procedencia de un usuario que visita nuestra web por la IP en PHP, para operaciones como por ejemplo cambiar el idioma del sitio, redirigir, cambiar la divisa, o cualquier operación, lo podemos realizar de la siguiente forma con el siguiente código PHP que os vamos a comentar.
Antes que nada necesitaremos descargarnos [...]]]></description>
			<content:encoded><![CDATA[<p>Si queremos <strong>detectar la procedencia de un usuario que visita nuestra web por la IP en PHP</strong>, para operaciones como por ejemplo cambiar el idioma del sitio, redirigir, <strong>cambiar la divisa</strong>, o cualquier operación, lo podemos realizar de la siguiente forma con el siguiente <strong>código PHP</strong> que os vamos a comentar.</p>
<p>Antes que nada necesitaremos descargarnos dos ficheros que contendrán la información de los diferentes países y el método para detectarlos. Los ficheros se tratan de <a href="http://www.rutarelativa.com/files/detectar-procedencia-usuario-ip-php/geoip.inc" title="Descargar el fichero geoip.inc" rel="external nofollow">geoip.inc</a> y <a href="http://www.rutarelativa.com/files/detectar-procedencia-usuario-ip-php/GeoIP.dat" title="Descargar el fichero GeoIP.dat" rel="external nofollow">GeoIP.dat</a>.</p>
<p>Una vez que nos hagamos con los ficheros, vamos a crear un fichero llamado geoIP.php (por ejemplo) y colocaremos los ficheros descargados en el mismo sitio. A continuación debemos incluir el siguiente código PHP en el fichero geoIP.php que nos <strong>devolverá el País al que pertenece el usuario por la IP</strong>:</p>
<p><span id="more-514"></span></p>
<pre class="php more"><code>
function geoIP()

{
	// Incluimos la libreria
	require( 'geoip.inc' );

	// Variables

	$gIP = null;
	$sGeo = null;

	// Instanciamos la variable y le indicamos el fichero .dat y el tipo de Geolocalizacion
	$gIP = geoip_open( 'GeoIP.dat', GEOIP_STANDARD );

	// Obtenemos el Pais por la IP
	$sGeo = geoip_country_name_by_addr( $gIP, $_SERVER['REMOTE_ADDR'] );

	// Cerramos
	geoip_close( $gIP );

	return $sGeo;

}
</code></pre>
<p>Con ésta <strong>sencilla función podremos obtener la procedencia de un visitante a través de la IP</strong>, ya lo que hagamos con ésta información es cosa nuestra.</p>
<p>Fuente: <a href="http://www.manualdephp.com/codigos-php/detectar-pais-visitante.html" title="Detectar país del visitante" rel="external nofollow">ManualDePHP</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.rutarelativa.com/php/detectar-procedencia-usuario-ip-php/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PHP: error Fatal error Allowed memory size</title>
		<link>http://www.rutarelativa.com/php/php-error-fatal-error-allowed-memory-size/</link>
		<comments>http://www.rutarelativa.com/php/php-error-fatal-error-allowed-memory-size/#comments</comments>
		<pubDate>Tue, 09 Mar 2010 11:10:15 +0000</pubDate>
		<dc:creator>KeLDroX</dc:creator>
				<category><![CDATA[Php]]></category>
		<category><![CDATA[Error]]></category>
		<category><![CDATA[error Fatal error Allowed memory size]]></category>
		<category><![CDATA[Memoria]]></category>
		<category><![CDATA[PHP.ini]]></category>
		<category><![CDATA[Solución]]></category>

		<guid isPermaLink="false">http://www.rutarelativa.com/?p=401</guid>
		<description><![CDATA[Hoy al instalar Symfony en uno de mis servidores me encontrado con el &#8220;famoso&#8221; error en PHP con el siguiente mensaje &#8220;error Fatal error Allowed memory size X&#8221; (donde X es el tamaño de la memoria). Este error es común cuando procesamos un script en PHP y éste traspasa el limite permitido dando un error [...]]]></description>
			<content:encoded><![CDATA[<p>Hoy al <strong>instalar Symfony</strong> en uno de mis servidores me encontrado con el &#8220;famoso&#8221; <strong>error en PHP</strong> con el siguiente mensaje &#8220;<strong>error Fatal error Allowed memory size X</strong>&#8221; (donde X es el tamaño de la memoria). Este error es común cuando procesamos un script en <strong>PHP y éste traspasa el limite permitido dando un error fatal.</strong></p>
<p><span id="more-401"></span></p>
<h3>Solucionar error Fatal error Allowed memory size</h3>
<p>Deberemos modificar nuestro php.ini con el editor que más nos guste, en mi caso el editor nano. En este servidor tengo instalado Xampp y editaremos el archivo php.ini de la siguiente forma:</p>
<pre class="code"><code>nano /opt/lampp/etc/php.ini</code></pre>
<p>Una vez abierto buscaremos la línea que contenga &#8220;memory_limit = XXM&#8221; en mi caso &#8220;memory_limit = 32M&#8221; y lo sustituimos por &#8220;memory_limit = 64M&#8221;. De esta forma reservaremos memoria suficiente para poder instalar Symfony y poder ejecutar los Script que necesiten <strong>más memoria en su procesamiento</strong>.</p>
<p><img class="imge" width="560" height="93" alt="PHP: error Fatal error Allowed memory size" title="PHP: error Fatal error Allowed memory size" src="http://www.images.rutarelativa.com/php-error-fatal-error-allowed-memory-size-1.gif">
<p>Una vez editado el archivo y guardado deberemos reiniciar Apache para que los cambios realizados hagan efecto. Ahora cuando ejecutemos un Script que necesite más memoria se podrá realizar sin ningún tipo de problema. En mi caso sólo necesitaba 64M, pero si estas realizando un gran Script puedes poner el tamaño que más se amolde a tus necesidades</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rutarelativa.com/php/php-error-fatal-error-allowed-memory-size/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dibujar figuras en PHP GD</title>
		<link>http://www.rutarelativa.com/php/dibujar-figuras-php-gd/</link>
		<comments>http://www.rutarelativa.com/php/dibujar-figuras-php-gd/#comments</comments>
		<pubDate>Mon, 01 Feb 2010 15:25:08 +0000</pubDate>
		<dc:creator>KeLDroX</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[Ejemplos]]></category>
		<category><![CDATA[GD]]></category>
		<category><![CDATA[Librerías]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.rutarelativa.com/?p=307</guid>
		<description><![CDATA[
Las figuras que nos deja dibujar PHP con la librería GD son las más básicas, como puede traernos cualquier editor de imágenes básico. Vamos a ver como se crean las siguientes figuras: rectángulo, cuadrado, y círculo. Para ello necesitamos tener habilitado la librería GD para nuestro servidor PHP. Antes de empezar podéis echar un vistazo [...]]]></description>
			<content:encoded><![CDATA[<p><img height="64" width="560" src="http://www.images.rutarelativa.com/dibujar-figuras-php-gd-1.gif" title="Dibujar figuras en Php GD" alt="Dibujar figuras en Php GD" class="imge">
<p>Las figuras que nos deja <strong>dibujar PHP con la librería GD</strong> son las más básicas, como puede traernos cualquier editor de imágenes básico. Vamos a ver como se crean las siguientes figuras: rectángulo, cuadrado, y círculo. Para ello necesitamos tener habilitado la <strong>librería GD para nuestro servidor PHP</strong>. Antes de empezar podéis echar un vistazo a <strong><a href="http://www.rutarelativa.com/desarrollo/crear-imagenes-html-php-gd/" title="Como crear imágenes en Html mediante Php GD">como crear imágenes en Html mediante PHP GD</a></strong>.</p>
<p><span id="more-307"></span></p>
<p>
<h3>¿Como dibujar un rectángulo en PHP GD?</h3>
<p>Una de las figuras más simples que todos conocemos, y para crearlo utilizaremos la función &#8220;<em>imagefilledrectangle</em>&#8221; para crear un rectángulo con relleno o la función &#8220;<em>imagerectangle</em>&#8221; para dibujar solo el contorno.</p>
<pre class="php"><code>// Tamaño de la imagen
$imImage = @imagecreate( 600, 100 );
// Color de fondo en RGB
$imFondo  = imagecolorallocate( $imImage, 255, 255, 255 );
// Color de relleno en RGB
$imRelleno = imagecolorallocate( $imImage, 141, 203, 61 );

// Creamos la instancia del rectangulo
imagefilledrectangle( $imImage, 0, 0, 300, 50, $imRelleno );

// Cabecera php para mostrar imagenes
header("Content-type: image/png");
// Imprimimos la imagen en PNG
imagepng( $imImage );
// Liberamos la memoria usada para crear la imagen
imagedestroy( $imImage );</code></pre>
<p>
<h3>¿Como dibujar un cuadrado en PHP GD?</h3>
<p>Las funciones para realizar un cuadrado son exactamente iguales que realizar un rectángulo pero lógicamente añadiremos el mismo ancho y alto.</p>
<pre class="php"><code>// Tamaño de la imagen
$imImage = @imagecreate( 600, 100 );
// Color de fondo en RGB
$imFondo  = imagecolorallocate( $imImage, 255, 255, 255 );
// Color de relleno en RGB
$imRelleno = imagecolorallocate( $imImage, 141, 203, 61 );

// Creamos la instancia del cuadrado
imagefilledrectangle( $imImage, 0, 0, 50, 50, $imRelleno );

// Cabecera php para mostrar imagenes
header("Content-type: image/png");
// Imprimimos la imagen en PNG
imagepng( $imImage );
// Liberamos la memoria usada para crear la imagen
imagedestroy( $imImage );</code></pre>
<p>
<h3>¿Como dibujar un circulo en PHP GD?</h3>
<p>Para dibujar un circulo tendremos que utilizar la función &#8220;<em>imageellipse</em>&#8221; para realizar el contorno y &#8220;<em>imagefilledellipse</em>&#8221; para rellenarla de color.</p>
<pre class="php"><code>// Tamaño de la imagen
$imImage = @imagecreate( 600, 100 );
// Color de fondo en RGB
$imFondo  = imagecolorallocate( $imImage, 255, 255, 255 );
// Color de relleno en RGB
$imRelleno = imagecolorallocate( $imImage, 141, 203, 61 );
// $imImage : identificador de la imagen creado
// 25: Coordenada horizontal del centro del ciruclo
// 25: Coordenada vertical del centro del circulo
// 50: Ancho del circulo
// 50: Alto del circulo
// $imRelleno: Color del relleno
imagefilledellipse( $imImage, 25, 25, 50, 50, $imRelleno );
// Cabecera php para mostrar imagenes
header("Content-type: image/png");
// Imprimimos la imagen en PNG
imagepng( $imImage );
// Liberamos la memoria usada para crear la imagen
imagedestroy( $imImage );</code></pre>
<p>
<p>Para crear nuevas figuras, como por ejemplo un arco tenéis más funciones. Podéis pasaros por el fantástico <a href="http://php.net/manual/en/book.image.php" title="Manual de PHP GD" rel="external nofollow">manual de PHP GD</a> y ver todas las funcionalidades de la <strong>libreria GD</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rutarelativa.com/php/dibujar-figuras-php-gd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fecha y hora con formato &#8220;Hace x horas, x minutos, x segundos&#8221; en PHP</title>
		<link>http://www.rutarelativa.com/php/fecha-y-hora-formato-hace-x-horas-x-minutos-x-segundos-php/</link>
		<comments>http://www.rutarelativa.com/php/fecha-y-hora-formato-hace-x-horas-x-minutos-x-segundos-php/#comments</comments>
		<pubDate>Mon, 21 Dec 2009 17:18:20 +0000</pubDate>
		<dc:creator>Sergiocius</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Php]]></category>

		<guid isPermaLink="false">http://www.rutarelativa.com/?p=163</guid>
		<description><![CDATA[Cuando trabajamos en PHP, el manejo de tipos de datos de fecha y hora es algo a lo que nos tenemos que enfrentar tarde o temprano. Mostrarle a un usuario la fecha y hora de cualquier registro con un formato &#8220;dd/mm/aaaa hh:mm:ss&#8221; a veces puede resultar confuso en el término de que es necesario calcular [...]]]></description>
			<content:encoded><![CDATA[<p>Cuando trabajamos en PHP, el manejo de <strong>tipos de datos de fecha y hora</strong> es algo a lo que nos tenemos que enfrentar tarde o temprano. Mostrarle a un usuario la fecha y hora de cualquier registro con un formato &#8220;dd/mm/aaaa hh:mm:ss&#8221; a veces puede resultar confuso en el término de que es necesario calcular mentalmente cuanto hace que se creó (por ejemplo) dicho registro. La función que os presento a continuación muestra la fecha y hora con un formato más amigable, es decir, más fácil de entender para un usuario. Mostraremos la <strong>fecha y hora con formato &#8220;Hace x horas, x minutos, x segundos&#8221; en nuestra web en PHP</strong>.</p>
<p><span id="more-163"></span></p>
<h3>Mostrar fecha y hora con formato &#8220;Hace x horas, x minutos, x segundos&#8221; en PHP</h3>
<p>Primero debemos de <strong>convertir el valor del campo timestamp en fecha de unix</strong> (segundos desde 1970-01-01 00:00:00 GMT), usando la función UNIX_TIMESTAMP de SQL.</p>
<pre class="code"><code>SELECT *, UNIX_TIMESTAMP( CAMPO_FECHA_HORA ) FROM TABLA</code></pre>
<p>
<p>A continuación, a la hora de mostrar dicho campo, <strong>pasaremos el resultado del campo &#8220;CAMPO_FECHA_HORA&#8221; por esta función</strong>:</p>
<pre class="php more"><code></code>
function hace($fecha_unix)
        //obtener la hora en formato unix
        $ahora=time();
        
        //obtener la diferencia de segundos
        $segundos=$ahora-$fecha_unix;
        
        //dias es la division de n segs entre 86400 segundos que representa un dia;
        $dias=floor($segundos/86400);

        //mod_hora es el sobrante, en horas, de la division de días;    
        $mod_hora=$segundos%86400;
        
        //hora es la division entre el sobrante de horas y 3600 segundos que representa una hora;
        $horas=floor($mod_hora/3600);
        
        //mod_minuto es el sobrante, en minutos, de la division de horas;       
        $mod_minuto=$mod_hora%3600;
        
        //minuto es la division entre el sobrante y 60 segundos que representa un minuto;
        $minutos=floor($mod_minuto/60);
        
        if($horas&lt;=0){
                echo $minutos." minutos";
        }elseif($dias&lt;=0){
                echo $horas." horas ".$minutos." minutos";
        }else{
                echo $dias." dias ".$horas." horas ".$minutos." minutos";
        }
</pre>
<p>De esta manera, usando esta función, tendremos el campo fecha hora en un formato mucho más amigable para el usuario. También hay que saber donde aplicar este tipo de formato y donde encaja mejor un formato clásico, pero siempre es bueno tener una alternativa útil de cara al usuario.</p>
<p>Fuente: <a href="http://www.ribosomatic.com/articulos/funcion-hace-n-dias-n-horas-n-minutos-en-php/" title="Función " hace="" n="" d="" horas="" minutos="" en="" php="" rel="external nofollow">RibosoMatic</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.rutarelativa.com/php/fecha-y-hora-formato-hace-x-horas-x-minutos-x-segundos-php/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Curl FOLLOWLOCATION and open basedir Or Safe Mode</title>
		<link>http://www.rutarelativa.com/php/curl-followlocation-and-open-basedir-or-safe-mode/</link>
		<comments>http://www.rutarelativa.com/php/curl-followlocation-and-open-basedir-or-safe-mode/#comments</comments>
		<pubDate>Sat, 19 Dec 2009 18:23:21 +0000</pubDate>
		<dc:creator>KeLDroX</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Php]]></category>

		<guid isPermaLink="false">http://www.rutarelativa.com/?p=156</guid>
		<description><![CDATA[¿Tienes el error &#8220;open basedir Or Safe Mode&#8221; al usar FollowLocation en curl?. Esto nos suele pasar por que las directivas Safe Mode o Open basedir de nuestro php.ini no están configuradas para realizar lo que queremos. En un servidor autogestionado o local podemos tocar el php.ini a nuestro antojo y configurar dichas directivas, pero [...]]]></description>
			<content:encoded><![CDATA[<p>¿Tienes el error <strong>&#8220;open basedir Or Safe Mode&#8221;</strong> al usar <strong>FollowLocation en curl</strong>?. Esto nos suele pasar por que las directivas <strong>Safe Mode</strong> o <strong>Open basedir</strong> de nuestro <strong>php.ini</strong> no están configuradas para realizar lo que queremos. En un servidor autogestionado o local podemos tocar el <strong>php.ini</strong> a nuestro antojo y configurar dichas directivas, pero cuando no tenemos acceso a el archivo de configuración (por ejemplo en servidores compartidos) esto ya no es posible, y debemos de buscar una alternativa.</p>
<p><span id="more-156"></span><br />
<br />
<h3>¿Que son las directivas open basedir y Safe Mode?</h3>
<p>El <strong>Modo Seguro de PHP (Safe Mode)</strong> es un intento para resolver el problemas de seguridad en un servidor compartido. Trata de resolver este problema a nivel de PHP verificando si el dueño del script actual coincide con el dueño del fichero a ser operado por una función de fichero (readfile(), mkdir(), etc). </p>
<p>Mientras que la directiva <strong>open basedir</strong> limita la interacción de los archivos con archivos fuera de la carpeta donde se está ejecutándose el script actual.</p>
<p>
<h3>¿Como &#8220;salto la protección&#8221; open basedir y Safe Mode para Curl en servidores compartidos?</h3>
<p>En servidores compartidos, como por ejemplo <strong>000webhost</strong>, tenemos este problema a la hora de ejecutar un script <strong>Curl con FollowLocation</strong>. Desde el manual oficial de <strong>PHP</strong> encuentro que el usuario <a href="http://au.php.net/manual/ro/function.curl-setopt.php#71313" title="Curl FOLLOWLOCATION and open basedir Or Safe Mode">eion</a> ha realizado una función para corregir este problema. Para entender la función y simplificar su explicación lo que realiza realmente es la primera petición <strong>curl</strong> obteniendo solo la cabecera, donde en ella podemos encontrar la redirección 301. Volverá a realizar la petición pero esta vez a la redirección y así sucesivamente. Es una buena alternativa para &#8220;saltarse&#8221; <strong>open basedir y Safe Mode para Curl</strong> en servidores como <strong>000webhost</strong>.</p>
<p>
<h3>Obtener función Curl para que PHP realize el &#8220;salto de protección&#8221; open basedir y Safe Mode</h3>
<p>El anterior post, &#8220;<a href="http://www.rutarelativa.com/php/curl-php/" title="Curl en PHP">Curl en PHP</a>&#8220;, dispone de esta función dando la posibilidad de realizar peticiones Curl en servidores como <strong>000webhost</strong> que no disponen de <strong>open basedir Or Safe Mode</strong>.</p>
<p>Enlace: <a title="Descargar Curl para PHP" href="http://www.rutarelativa.com/files/curl-php.zip">Descargar Curl para PHP</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.rutarelativa.com/php/curl-followlocation-and-open-basedir-or-safe-mode/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Curl en PHP</title>
		<link>http://www.rutarelativa.com/php/curl-php/</link>
		<comments>http://www.rutarelativa.com/php/curl-php/#comments</comments>
		<pubDate>Sat, 19 Dec 2009 13:06:36 +0000</pubDate>
		<dc:creator>KeLDroX</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Php]]></category>

		<guid isPermaLink="false">http://www.rutarelativa.com/?p=155</guid>
		<description><![CDATA[Hace poco realizamos una función Curl para Python, ya que teníamos la necesidad de realizar peticiones a una página Web en dicho lenguaje. En todos los servidores no tenemos la posibilidad de usar Python por ello hemos trasladado la función a otro lenguaje más Universal como es PHP. La función Curl para PHP es muy [...]]]></description>
			<content:encoded><![CDATA[<p>Hace poco realizamos una <a href="http://www.rutarelativa.com/desarrollo/curl-python/" title="Curl en Python">función Curl para Python</a>, ya que teníamos la necesidad de realizar peticiones a una <strong>página Web</strong> en dicho lenguaje. En todos los servidores no tenemos la posibilidad de usar <strong>Python</strong> por ello hemos trasladado la función a otro lenguaje más Universal como es <strong>PHP</strong>. La función <strong>Curl para PHP</strong> es muy parecida, aunque le hemos añadido unas cuantas mejoras.</p>
<p><span id="more-155"></span></p>
<h3>Función Curl para PHP</h3>
<pre class="php more"><code>function followLocation($crCurl, &amp;$crInfo)
{
    // Variables
    static $nCurlLoops = 0;
    $nCurlMaxLoops     = 20;

    $sPage             = null;
    $aMatches          = null;
    $aLastUrl          = null;
    $aUrl              = null;
    $sHeader           = null;

    // Si hemos realizado 20 redirecciones paramos

    if( $nCurlLoops &gt;= $nCurlMaxLoops )
        return false;

    // Obligamos que la petición nos nuestre la cabecera para poder ver donde nos llevara la redireccion

    curl_setopt( $crCurl, CURLOPT_HEADER, 1 );

    // Ejecutamos curl
    $sPage = curl_exec( $crCurl );

    // Obtenemos información sobre la petición

    $crInfo = curl_getinfo( $crCurl );

    // Separamos la cabecera de lo que esl contenido de la página

    list( $sHeader, $sPage ) = explode( "\n\n", $sPage, 2 );

    if( in_array( $crInfo["http_code"], array( 301, 302 ) ) )

    {
        // Obtenemos la dirección donde se iba a realizar la redicción
        $aMatches = array();
        preg_match( "/Location:(.*?)\n/", $sHeader, $aMatches );

        $aUrl = @parse_url( trim( array_pop( $aMatches ) ) );

        // Comprobamos sea un array valido, de no serlo no podremos realizar la redirección

        if( ! is_array( $aUrl) )
            return $sPage;

        // Obtenemos desde donde se va hacer la redirección
        $aLastUrl = parse_url( curl_getinfo( $crCurl, CURLINFO_EFFECTIVE_URL ) );

        // Contruimos la url de la redirección
        if( ! $aUrl["scheme"] )
            $aUrl["scheme"] = $aLastUrl["scheme"];

        if( ! $aUrl["host"] )
            $aUrl["host"] = $aLastUrl["host"];

        if( ! $aUrl["path"] )

            $aUrl["path"] = $aLastUrl["path"];

        // Realizamos la petición con la nueva URL obtenida que sera la redicción

        curl_setopt( $crCurl, CURLOPT_URL, $aUrl["scheme"] . "://" . $aUrl["host"] . $aUrl["path"] . ($aUrl["query"]? "?" . $aUrl["query"] : "") );

        // Sumamos la redirección
        ++$nCurlLoops;

        return followLocation( $crCurl, $crInfo);
    }
    else
    {
        $crInfo["redirect_count"] = $nCurlLoops;

        return $sPage;
    }
}

function curl($aArgumentos, &amp;$crInfo = false)
{
    // Variables
    $sUrl        = (! empty( $aArgumentos["url"] ) ? $aArgumentos["url"] : null);

    $sPostField  = (! empty( $aArgumentos["post"] ) ? http_build_query( $aArgumentos["post"] ) : null);
    $ckCookie    = (! empty( $aArgumentos["cookie"] ) ? $aArgumentos["cookie"] : null);

    $nHeader     = (! empty( $aArgumentos["header"] ) ? $aArgumentos["header"] : 0);
    $nReturn     = (! empty( $aArgumentos["return_transfer"] ) ? $aArgumentos["return_transfer"] : 1);

    $nTimeOut    = (! empty( $aArgumentos["time_out"] ) ? $aArgumentos["time_out"] : 30);
    $sAgent      = (! empty( $aArgumentos["agent"] ) ? $aArgumentos["agent"] : "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.8");

    $sReferer    = (! empty( $aArgumentos["referer"] ) ? urlencode( $aArgumentos["referer"] ) : "-");

    $aReferer    = (! empty( $aArgumentos["aReferer"] ) ? $aArgumentos["aReferer"] : array() );
    $aProxys     = (! empty( $aArgumentos["proxy"] ) ? $aArgumentos["proxy"] : array() );

    $sUserPasswd = (! empty( $aArgumentos["user_passwd"] ) ? $aArgumentos["user_passwd"] : null);
    $aProxy      = null;

    $nRandom     = null;
    $crCurl      = curl_init();
    $sPage       = null;
    $aHeader     = array( "Accept: image/gif, image/x-bitmap, image/jpeg, image/pjpeg", "Connection: Keep-Alive", "Content-type: application/x-www-form-urlencoded;charset=UTF-8" );

    $nRandomRf   = null;

    // Comprobamos si nos han pasado un array con referers para modificar el referer

    if( count( $aReferer ) )
    {
        // Referer aleatorio
        $nRandomRf = rand( 0, count( $aReferer ) -1 );

        $sReferer  = str_replace( "[curl_text]" , $sReferer, $aReferer[$nRandomRf] );
    }

    // Opciones
    curl_setopt( $crCurl, CURLOPT_URL, $sUrl );
    curl_setopt( $crCurl, CURLOPT_HEADER, $nHeader );

    curl_setopt( $crCurl, CURLOPT_RETURNTRANSFER, $nReturn );
    curl_setopt( $crCurl, CURLOPT_HTTPHEADER, $aHeader );
    curl_setopt( $crCurl, CURLOPT_CONNECTTIMEOUT, $nTimeOut );
    curl_setopt( $crCurl, CURLOPT_REFERER, $sReferer );

    curl_setopt( $crCurl, CURLOPT_USERAGENT, $sAgent);

    if( $sUserPasswd )
        curl_setopt( $crCurl, CURLOPT_USERPWD, $sUserPasswd );

    if( count( $aProxys ) )

    {
        // Usamos un random para ir cambiando de proxys
        $nRandom = rand( 0, count( $aProxys ) - 1 );

        $aProxy  = explode( ":", $aProxys[$nRandom] );

        curl_setopt( $crCurl, CURLOPT_CONNECTTIMEOUT, 60 );

        curl_setopt( $crCurl, CURLOPT_PROXY, $aProxys[$nRandom] );

        curl_setopt( $crCurl, CURLOPT_HTTPPROXYTUNNEL, 0);
    }

    if( $sPostField )
    {
        curl_setopt( $crCurl, CURLOPT_POST, 1 );
        curl_setopt( $crCurl, CURLOPT_POSTFIELDS, $sPostField );

    }

    if( $ckCookie )
    {
        curl_setopt( $crCurl, CURLOPT_COOKIEJAR, $ckCookie );
        curl_setopt( $crCurl, CURLOPT_COOKIEFILE, $ckCookie );
    }

    // open basedir Or Safe Mode

    if( ini_get( "open_basedir" ) == "" &amp;&amp; ini_get( "safe_mode" == "Off" ) )
    {
        curl_setopt( $crCurl, CURLOPT_FOLLOWLOCATION, 1 );

        $sPage = curl_exec( $crCurl );

        $crInfo = curl_getinfo( $crCurl );
    }
    else
        return followLocation( $crCurl, $crInfo );

    // Comprobamos si ha sido exitosa la conexion de no serlo volvemos hacerla
    if( ! in_array( $crInfo["http_code"], array( 200, 302, 301 ) ) )

        curl( $aArgumentos );

    // Si la conexión ha sido posible cerramos
    if( in_array( $crInfo["http_code"], array( 200, 302, 301 ) ) )

        curl_close( $crCurl );

    return( $sPage );
}</code></pre>
<p>
<h3>Argumentos para la función Curl</h3>
<table>
<tbody>
<tr>
<td width="80"><strong>url</strong>:</td>
<td>Dirección donde se realizará la petición por <strong>CURL</strong>.</td>
</tr>
<tr>
<td width="80"><strong>post</strong>:</td>
<td>Datos que se enviarán en una operación de tipo &#8220;HTTP POST&#8221;. Debe ser pasado como una cadena &#8216;para1 = val1 &amp; para2 = val2 &amp;&#8230;&#8217;.</td>
</tr>
<tr>
<td width="80"><strong>cookie</strong>:</td>
<td>Dirección donde se guardará la cookie, si se añade sólo el nombre se guardara en el directorio donde se ejecute el Script.</td>
</tr>
<tr>
<td width="80"><strong>header</strong>:</td>
<td>Mostrar la cabecera HTTP, por defecto 0.</td>
</tr>
<tr>
<td width="80"><strong>return_transfer</strong>:</td>
<td>Posibilidad de obtener el HTML de la petición. Por defecto 1.</td>
</tr>
<tr>
<td width="80"><strong>time_out</strong>:</td>
<td>Tiempo de espera para la petición. Por defecto 30.</td>
</tr>
<tr>
<td width="80"><strong>agent</strong>:</td>
<td>Contenido de &#8220;User-Agent:&#8221; para la cabecera en una petición HTTP. Por defecto &#8216;Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.8&#8242;.</td>
</tr>
<tr>
<td width="80"><strong>referer</strong>:</td>
<td>Contenido de &#8220;Referer:&#8221; para la cabecera en una petición HTTP. Por defecto &#8216;-&#8217;.</td>
</tr>
<tr>
<td width="80"><strong>aReferer</strong>:</td>
<td>Array con varios casos de &#8216;Referer:&#8217;. Podríamos añadir todos las referencias de Google, Yahoo, etc. Así mostraría el referido como si viniera de unos de estos buscadores. Por defecto NULL.</td>
</tr>
<tr>
<td width="80"><strong>proxy</strong>:</td>
<td>Array con varias IP de servidores Proxy. Por defecto NULL.</td>
</tr>
<tr>
<td width="80"><strong>user_passwd</strong>:</td>
<td>Usuario y contraseña que se usarán para la conexión, con el formato USUARIO:PASSWORD. Por defecto NULL.</td>
</tr>
</tbody>
</table>
<p>
<h3>Ejemplo: Cambiar estado de Twitter mediante Curl</h3>
<pre class="php"><code>curl(array( "url"         =&gt; "http://twitter.com/statuses/update.json",
            "post"        =&gt; array( "status" =&gt; "Hola desde PHP!" ),

            "user_passwd" =&gt; "keldrox:password"
));</code></pre>
<p>
<p>Una simple función <strong>Curl para PHP</strong> que nos ayudará a la hora de desarrollar scripts que necesiten realizar muchas peticiones. Ya que su simpleza enviando solo argumentos nos ayuda estar escribiendo muchas líneas de opciones para las peticiones <strong>Curl</strong>, aparte de tener un código más simple.</p>
<p>Enlace: <a href="http://www.rutarelativa.com/files/curl-php.zip" title="Descargar Curl para PHP">Descargar Curl para PHP</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.rutarelativa.com/php/curl-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Subir archivos con Mootools, Jquery, flash y FileApi W3C</title>
		<link>http://www.rutarelativa.com/php/subir-archivos-mootools-jquery-flash-fileapi-w3c/</link>
		<comments>http://www.rutarelativa.com/php/subir-archivos-mootools-jquery-flash-fileapi-w3c/#comments</comments>
		<pubDate>Thu, 17 Dec 2009 10:49:33 +0000</pubDate>
		<dc:creator>KeLDroX</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Php]]></category>

		<guid isPermaLink="false">http://www.rutarelativa.com/?p=142</guid>
		<description><![CDATA[
Subir o realizar upload de archivos a un servidor es una de las tareas más complicadas a mi parecer para los formularios HTML, ya que es un proceso que necesita interactuar con el usuario que sube el archivo, mostrando un porcentaje y confirmando de que el archivo ha sido subido (sin contar temas de seguridad, [...]]]></description>
			<content:encoded><![CDATA[<p><img class="imge" width="560" height="175" alt="Subir archivos con Mootools, Jquery, flash y FileApi W3C" title="Subir archivos con Mootools, Jquery, flash y FileApi W3C" src="http://www.images.rutarelativa.com/subir-archivos-mootools-jquery-flash-fileapi-w3c-1.gif">
<p><strong>Subir</strong> o realizar <strong>upload</strong> de archivos a un servidor es una de las tareas más complicadas a mi parecer para los formularios HTML, ya que es un proceso que necesita interactuar con el usuario que <strong>sube el archivo</strong>, mostrando un porcentaje y confirmando de que el archivo ha sido subido (sin contar temas de seguridad, cosa que añade más dificultad si cabe). Todo esto para que quede acorde con nuestros diseños y de una apariencia más de aplicación de escritorio, necesitamos realizarlo mediante <strong>Javascript</strong>. <a href="http://www.anieto2k.com/2009/12/15/drag-drop-file-api-xmlhttprequest-el-futuro-de-la-subida-de-ficheros/" title="Drag &amp; Drop + File API + XMLHttpRequest = El futuro de la subida de ficheros">Anieto2k publica un interesante enlace en el que podremos arrastrar imágenes desde nuestro escritorio al explorador</a> con la <strong>beta 1 de Firefox 3.6</strong>. El realizar Drag &amp; Drop desde el escritorio es posible gracias al <strong>FileAPI, propuesta por la W3C</strong>, y la subida del archivo sin recargar viene de la mano del objeto <strong>XMLHttpRequest (Ajax)</strong>. Veamos varios ejemplos de como subir archivos con Javascript, flash y FileApi W3C:</p>
<p><span id="more-142"></span></p>
<p>
<h3>Subir archivos mediante Mootools</h3>
<p>Sin duda <strong>Mootools</strong> es una de mis librerías preferidas, además cuenta con bastantes plugins. Uno de ellos es <strong>FancyUpload</strong> que nos permite subir múltiples archivos hacia nuestro servidor.</p>
<p><a href="http://github.com/digitarald/digitarald-fancyupload" title="Descargar FancyUpload" rel="external nofollow">Descargar FancyUpload</a></p>
<p><a href="http://digitarald.de/project/fancyupload/3-0/showcase/attach-a-file/" title="Demo de FancyUpload" rel="external nofollow">Demo de FancyUpload</a></p>
<p>
<h3>Subir archivos mediante Jquery</h3>
<p><strong>Uploadify</strong> es un plugin para <strong>Jquery</strong> que convierte los input file de nuestro formulario a objetos <strong>flash</strong> para poder realizar la <strong>subida de nuestros archivos</strong>. Permite la subida sola de un archivo o de múltiples.</p>
<p><a href="http://www.uploadify.com/download" title="Descargar Uploadify" rel="external nofollow">Descargar Uploadify</a></p>
<p><a href="http://www.uploadify.com/demo/" title="Demo de Uploadify" rel="external nofollow">Demo de Uploadify</a></p>
<p>
<h3>Subir archivos mediante Flash</h3>
<p>Unijimpe creó hace tiempo un sencillo <strong>script en FLash</strong> que nos permite subir archivos hacia nuestro servidor. Permite la <strong>subida de un solo archivo</strong>, pero como ejemplo y ver como realmente funciona la clase FileReference de Flash para subir archivos tenéis estos enlaces.</p>
<p><a href="http://www.box.net/shared/66kegd36td" title="Descargar Upload Flash" rel="external nofollow">Descargar Upload Flash</a></p>
<p><a href="http://samples.unijimpe.net/flashupload/" title="Demo Upload Flash" rel="external nofollow">Demo Upload Flash</a></p>
<p>
<h3>Subir archivos mediante FileApi W3C</h3>
<p>Con la salida de los nuevos estándares disponemos de <strong>FileApi</strong>, la encargada de poder arrastrar nuestros archivos desde el escritorio hacia el explorador y poder subirlos. Para utilizar la demo necesitamos de la versión <strong>beta 1 de Firefox 3.6</strong>.</p>
<p><a href="http://demos.hacks.mozilla.org/openweb/uploadingFiles/main.js" title="Descargar FileApi" rel="external nofollow">Descargar FileApi</a></p>
<p><a href="http://demos.hacks.mozilla.org/openweb/uploadingFiles/" title="Demo FileApi" rel="external nofollow">Demo FileApi</a></p>
<p>Como vemos, el proceso de subir un fichero a la web no es fácil, pero gracias a estas útiles herramientas tenemos a nuestra disposición un mundo de interactividad. Además, con la salida de los nuevos estándares, nos acercamos más a la interactividad entre hombre, computador y web; finalidad de la evolución de Internet y las comunicaciones.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rutarelativa.com/php/subir-archivos-mootools-jquery-flash-fileapi-w3c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DOMElement obtener Html (DOMElement to Html)</title>
		<link>http://www.rutarelativa.com/php/domelement-obtener-html-domelement-to-html/</link>
		<comments>http://www.rutarelativa.com/php/domelement-obtener-html-domelement-to-html/#comments</comments>
		<pubDate>Tue, 15 Dec 2009 16:52:43 +0000</pubDate>
		<dc:creator>KeLDroX</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Php]]></category>

		<guid isPermaLink="false">http://www.rutarelativa.com/?p=134</guid>
		<description><![CDATA[Hoy mismo en uno de mis proyectos me surgió un problema de que necesitaba obtener el  Html que tenía almacenado en un objeto DOMElement. Buscando por la documentación de PHP he podido encontrar la solución, que compartiré con ustedes ya que he tardado bastante tiempo en obtener el Html de un objeto DOMElement y [...]]]></description>
			<content:encoded><![CDATA[<p>Hoy mismo en uno de mis proyectos me surgió un problema de que necesitaba <strong>obtener el  Html</strong> que tenía almacenado en un objeto <strong>DOMElement</strong>. Buscando por la documentación de <strong>PHP</strong> he podido encontrar la solución, que compartiré con ustedes ya que he tardado bastante tiempo en <strong>obtener el Html de un objeto DOMElement</strong> y así os ahorro ese tiempo. No existe método para realizar el paso de <strong>DOMElement a Html</strong> de forma nativa, pero existe una forma que consiste en crear un nuevo objeto <strong>DOMDocument</strong> y en él clonarle el <strong>nodo del que queremos obtener el HTML</strong>, para posteriormente almacenarlo en una variable.</p>
<p><span id="more-134"></span></p>
<h3>Html que obtendremos mediante DOMDocument</h3>
<pre class="html"><code>&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="es-ES"&gt;
	&lt;head&gt;
		&lt;title&gt;Ejemplo&lt;/title&gt;
		&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&gt;
		&lt;meta name="language" content="es" /&gt;
	&lt;/head&gt;
	&lt;body&gt;
		&lt;table&gt;
			&lt;tr&gt;&lt;td&gt;Soy una&lt;/td&gt;&lt;/tr&gt;
			&lt;tr&gt;&lt;td&gt;tabla&lt;/td&gt;&lt;/tr&gt;
		&lt;/table&gt;
	&lt;/body&gt;
&lt;/html&gt;</code></pre>
<h3>Ejemplo práctico en PHP para obtener Html de un DOMElement</h3>
<pre class="php more"><code>&lt;?php
	// Variables
	$dcDocument = new DOMDocument();
	$dmTabla    = null;

	// Cargamos el HTML
	$dcDocument-&gt;loadHTML( "&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;
							&lt;html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="es-ES"&gt;
								&lt;head&gt;
									&lt;title&gt;Ejemplo&lt;/title&gt;
									&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&gt;
									&lt;meta name="language" content="es" /&gt;
								&lt;/head&gt;
								&lt;body&gt;
									&lt;table&gt;
										&lt;tr&gt;&lt;td&gt;Soy una&lt;/td&gt;&lt;/tr&gt;
										&lt;tr&gt;&lt;td&gt;tabla&lt;/td&gt;&lt;/tr&gt;
									&lt;/table&gt;
								&lt;/body&gt;
							&lt;/html&gt;" );

	// Nos posicionamos en la tabla
	$dmTabla = $dcDocument-&gt;getElementsByTagName( "table" )-&gt;item(0);

	// Pintaremos solo la tabla pasando el objeto DOMElement para obtener el Html
	echo getHtml( $dmTabla );

function getHtml($dcNode)
{
    $dcAux = new DOMDocument( "1.0" );
    $dcNodeAux = $dcAux-&gt;importNode( $dcNode-&gt;cloneNode( true ), true );
    $dcAux-&gt;appendChild($dcNodeAux);

    return $dcAux-&gt;saveHTML();
}
?&gt;</code></pre>
<h3>Función que realiza el paso DOMElement to Html</h3>
<pre class="php"><code>function getHtml($dcNode)
{
    $dcAux = new DOMDocument( "1.0" );
    $dcNodeAux = $dcAux-&gt;importNode( $dcNode-&gt;cloneNode( true ), true );
    $dcAux-&gt;appendChild($dcNodeAux);

    return $dcAux-&gt;saveHTML();
}</code></pre>
<p>Una sencilla solución basada en el comentario de <a href="http://www.php.net/manual/en/class.domelement.php#90742" title="DOMElement obtener Html (DOMElement to Html)" rel="external nofollow">Daniel Morlock</a> en la documentación de <strong>PHP</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rutarelativa.com/php/domelement-obtener-html-domelement-to-html/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Variables PHP en CSS</title>
		<link>http://www.rutarelativa.com/php/variables-php-css/</link>
		<comments>http://www.rutarelativa.com/php/variables-php-css/#comments</comments>
		<pubDate>Mon, 07 Dec 2009 10:08:45 +0000</pubDate>
		<dc:creator>KeLDroX</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Php]]></category>

		<guid isPermaLink="false">http://www.rutarelativa.com/?p=91</guid>
		<description><![CDATA[En el mundo de la programación se crean infinidad de variables que van cambiando según se interactúa con el programa. En CSS tampoco podría ser menos y la versión 3 de CSS permite realizarlo. El problema radica en que todos los exploradores no soportan esta funcionalidad, ni tampoco podría obtener valores desde MYSQL o PHP. [...]]]></description>
			<content:encoded><![CDATA[<p>En el mundo de la programación se crean infinidad de <strong>variables</strong> que van cambiando según se interactúa con el programa. En <strong>CSS</strong> tampoco podría ser menos y la <strong>versión 3 de CSS</strong> permite realizarlo. El problema radica en que todos los exploradores no soportan esta funcionalidad, ni tampoco podría obtener valores desde MYSQL o PHP. Por ello existe un pequeño truco que he utilizado en uno de mis últimos proyectos.</p>
<h3>Como utilizar variables PHP en CSS</h3>
<p>Añadimos a nuestra cabecera la hoja de estilo</p>
<pre class="html"><code>&lt;link rel='stylesheet' type='text/css' href='estilo.css' /&gt;</code></pre>
<p><span id="more-91"></span></p>
<p>Archivo estilo.css</p>
<pre class="css"><code>&lt;?php
    header("Content-type: text/css; charset: UTF-8");

   $color1 = '#FFFFFF';
   $color2 = '#FFCC33';
?&gt;

#cabecera
{
   background-color: &lt;?php echo $color1; ?&gt;;
}

a
{
  color: &lt;?php echo $color2; ?&gt;;
}

</code></pre>
<p>Archivo .htaccess</p>
<pre class="code"><code>&lt;FilesMatch "^.*?estilo.*?$"&gt;
SetHandler php5-script
&lt;/FilesMatch&gt;</code></pre>
<p>
<p>Como vemos al poder usar <strong>variables PHP dentro del CSS</strong> se pueden extender otras ideas como, compresión por GZIP, atacar a MYSQL, etc. La configuración del archivo .htaccess es importante para que el archivo <strong>CSS</strong> sea procesado como un archivo <strong>PHP</strong> y así poder utilizar las variables.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rutarelativa.com/php/variables-php-css/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
