<?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>Adobe User Group Granada &#187; php</title>
	<atom:link href="http://www.adobe-user-group-granada.es/tag/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.adobe-user-group-granada.es</link>
	<description>Grupo de usuarios de Adobe orientado a Dreamweaver y Spry en la ciudad de Granada</description>
	<lastBuildDate>Sat, 21 Jan 2012 19:10:40 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Guía de supervivencia con Apache</title>
		<link>http://www.adobe-user-group-granada.es/guia-de-supervivencia-con-apache/</link>
		<comments>http://www.adobe-user-group-granada.es/guia-de-supervivencia-con-apache/#comments</comments>
		<pubDate>Thu, 17 Nov 2011 18:31:50 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[apache]]></category>
		<category><![CDATA[artículos]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[tutoriales]]></category>

		<guid isPermaLink="false">http://www.adobe-user-group-granada.es/?p=1019</guid>
		<description><![CDATA[El servidor web Apache es uno de los más extendidos y con más opciones de configuración, esto implica que es complejo. Vamos a ver cómo sobrevivir con Apache.


Guía de supervivencia con Apache

Otras veces ya hemos visto como realizar una instalación de Apache con PHP y eAccelerator, una vez instalado los ficheros ejecutables importantes son:

apachectl: Mediante [...]]]></description>
			<content:encoded><![CDATA[<p>El <strong>servidor web Apache</strong> es uno de los más extendidos y con más opciones de configuración, esto implica que es complejo. Vamos a ver <strong>cómo sobrevivir con Apache</strong>.</p>
<p><span id="more-1019"></span></p>
<div id="attachment_3639">
<p><a href="http://systemadmin.es/wp-content/uploads/2011/11/supervivencia-con-Apache.jpg"></a>Guía de supervivencia con Apache</p>
</div>
<p>Otras veces ya hemos visto como realizar una <a href="http://systemadmin.es/2009/08/instalacion-de-un-servidor-lamp-v-apache-con-php-y-eaccelerator">instalación de Apache con PHP y eAccelerator</a>, una vez instalado los ficheros ejecutables importantes son:</p>
<ul>
<li><strong>apachectl</strong>: Mediante este script podremos:
<ul>
<li>Gestionar el arranque y parada del daemon (<strong>start</strong>/<strong>stop</strong>)</li>
<li>Comprobar la configuración (<strong>configtest</strong>):
<pre># /usr/local/apache22/bin/apachectl configtest
Syntax OK</pre>
</li>
<li>Recargar la configuración en caliente, sin apagar el daemon (<strong>graceful</strong>)</li>
</ul>
</li>
<li><strong>httpd</strong>: Binario del daemon, con dicho fichero podemos:
<ul>
<li>Indicar que fichero de configuración cargar (<strong>opción -f</strong>)</li>
<li>Ver el listado de módulos que carga (<strong>opción -M</strong>):
<pre># /usr/local/apache22/bin/httpd -M
Loaded Modules:
 core_module (static)
(...)
 jrun_module (shared)</pre>
</li>
<li>Al igual que con <strong>apachectl</strong>, comprobar la configuración con la <strong>opción -t</strong>:
<pre># /usr/local/apache22/bin/httpd -t
Syntax OK</pre>
</li>
<li>Ver el resumen de configuración de los <strong>VirtualHosts</strong> con la <strong>opción -S</strong>:
<pre># /usr/local/apache22/bin/httpd -S
VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:80                   is a NameVirtualHost
         default server shuvak.systemadmin.es (/usr/local/apache22/conf/extra/httpd-vhosts.conf:7)
         port 80 namevhost shuvak.systemadmin.es (/usr/local/apache22/conf/extra/httpd-vhosts.conf:7)
         port 80 namevhost systemadmin.es (/usr/local/apache22/conf/extra/vhosts/systemadmin.es.conf:1)
         port 80 namevhost foro.systemadmin.es (/usr/local/apache22/conf/extra/vhosts/foro.systemadmin.es.conf:1)
Syntax OK</pre>
</li>
</ul>
</li>
</ul>
<p>Un ejemplo de <strong>configuración típica de un VirtualHost</strong> sería la siguiente:</p>
<pre>&lt;VirtualHost *:80&gt;
        DocumentRoot "/var/www/systemadmin.es/htdocs"
        DirectoryIndex index.php
        ServerName systemadmin.es
        ServerAlias foro.systemadmin.es

        &lt;Directory /var/www/systemadmin.es/htdocs&gt;
            Options FollowSymLinks
            AllowOverride all
            Order deny,allow
            Allow from all
        &lt;/Directory&gt;

        ErrorLog  "| /usr/local/sbin/cronolog -S /var/www/systemadmin.es/logs/current.error.log /var/www/systemadmin.es/logs/%Y/%m/%d/error.log"
        CustomLog "| /usr/local/sbin/cronolog -S /var/www/systemadmin.es/logs/current.custom.log /var/www/systemadmin.es/logs/%Y/%m/%d/custom.log" combined

&lt;/VirtualHost&gt;</pre>
<p>Las directivas importantes son:</p>
<ul>
<li><strong>DocumentRoot</strong>: Directorio base desde el cual  serviremos el contenido. Deberemos acompañarlo de la directiva Directory  para establecer si se puede servir o no su contenido</li>
<li><strong>DirectoryIndex</strong>: Cuando se intente servir la raíz o  cualquier directorio (sin especificar fichero), cual se debería servir.  Típicamente se usa index.algo, pero podría ser cualquier fichero. Esta  directiva indica que fichero servir y en que orden de prioridad. Por  ejemplo:
<pre>DirectoryIndex index.php index.html index.htm</pre>
<p>Primero miraría si existe un fichero <strong>index.php</strong>, en caso que no exista buscaría el siguiente (<strong>index.html</strong>) y así el listado que indiquemos. En caso que no exista ninguno, <strong>se serviría un 404</strong></li>
<li><strong>ServerName</strong> y <strong>ServerAlias</strong>: Nombres a los que responde según el <a href="http://systemadmin.es/2010/08/especificar-que-host-header-debe-usar-el-curl">header Host</a>. Se pueden <strong>especificar wildcards</strong> tanto pode delante (<strong>*.systemadmin.es</strong>) como por detrás (<strong>webmail.*</strong>). La diferencia entre <strong>ServerName</strong> y <strong>ServerAlias</strong> a la practica tiene poca importancia.</li>
</ul>
<p>En cuanto a la <strong>gestión de logs</strong>, personalmente uso <a href="http://systemadmin.es/2009/01/rotacion-de-logs-de-apache-mediante-cronolog">cronolog</a> ya que una vez configurado cómo queremos almacenar los logs no  deberemos hacer mantenimiento a no se que queramos eliminar los  antiguos. Para ello suelo emplear un simple script que haga limpieza:</p>
<pre>#!/bin/bash
for i in $(find /var/www/ -maxdepth 2 -iname logs);
do

        #eliminacion de los mas antiguos de 10 dias
        find $i -mtime +10 -type f -exec rm {} \;

        #eliminacion de directios vacios
        find $i -empty -type d -exec rmdir {} \; 2&gt;/dev/null

        #compresión de logs ya rotados
        find $i -type f -iname \*\.log -mtime +2 -exec gzip {} \;

done</pre>
<p>Deberemos <strong>adaptar el find del for</strong> para que encuentre los directorios raíz dónde tenemos los logs.</p>
<p>Para conocer el estado del Apache existe el <a href="http://systemadmin.es/2009/02/instalacion-del-server-status-mod_status-de-apache">modulo mod_status</a>, que nos indica que esta haciendo dicho daemon. Generalmente se instala en <strong>/server-staus</strong> con <strong>acceso limitado por IP de origen</strong>.</p>
<p>En el <strong>scoreboard</strong> veremos los estado del los <strong>apachitos</strong> (procesos apache) y podremos ver si existe algún problema con algún VirtualHost. Típicamente podremos ver:</p>
<ul>
<li>Se nos llena el scoreboard de <strong>W</strong>: Cuando un slot esta en estado W significa que esta contestando, pero si vemos que se nos acumulan <strong>W</strong> posiblemente esta contestando muy lentamente por algún motivo o bien  simplemente se queda colgado. Generalmente indica problemas en la base  de datos.Si habilitamos la opción
<pre>ExtendedStatus On</pre>
<p>Tendremos un listado de todas las peticiones y su estado, para cuanto  tiempo lleva un slot en el estado actual deberemos fijarnos en la  columna <strong>SS</strong>. Por lo tanto, las peticiones <strong>en estado W que tenga el SS alto</strong> son las primeras que deberemos investigar. Evidentemente, si servimos contenido estático (un <strong>mp3</strong>) es lógico que tarde en ser entregado y por lo tanto que <strong>su SS sea alto</strong>.</li>
<li>Se nos llena el scoreboard de <strong>K</strong>: Tendremos que ver  si nos interesa reducir el tiempo de KeepAlive de las conexiones. Por  defecto lo tenemos a 5 segundos, pero lo podemos dejar en 1 o 2 segundos  según la aplicación.</li>
</ul>
<p>En otra ocasión ya hablamos de en que debemos fijarnos para <a href="http://systemadmin.es/2010/04/encontrar-la-raiz-del-problema-en-un-entorno-lamp-i">entender el problema que tenga un entorno LAMP</a></p>
<p>Otra cosa a tener en cuenta es la <a href="http://systemadmin.es/2009/04/diferencia-entre-serverlimit-y-maxclients-de-apache">diferencia entre ServerLimit y MaxClients</a>: <strong>ServerLimit</strong> es el límite fijo que no puede ser modificado mediante una recarga de configuración (graceful) mientras que <strong>MaxClients</strong> es el límite actual.</p>
<p>Actualmente <strong>mod_status</strong> no muestra los slots de Apache que quedan deshabilitados por la directiva <strong>MaxClients</strong>, por lo que nos puede dar pie a error al suponerlos libres. En su momento hice un patch para evitar esto y <strong>será incluido en la próxima release de Apache</strong> (2.4), actualmente <a href="http://systemadmin.es/2011/03/apache-2-4-beta-httpd-2-3-11">ya se encuentra disponible en la versión beta desde la versión 2.3.11</a>.</p>
<p>Nuestra fuente: <a href="http://systemadmin.es/2011/11/guia-de-supervivencia-con-apache" target="_blank">Systemadmin</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.adobe-user-group-granada.es/guia-de-supervivencia-con-apache/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Librería PHP para TwitPic</title>
		<link>http://www.adobe-user-group-granada.es/libreria-php-para-twitpic/</link>
		<comments>http://www.adobe-user-group-granada.es/libreria-php-para-twitpic/#comments</comments>
		<pubDate>Wed, 01 Jun 2011 10:14:52 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[artículos]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[redes sociales]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://www.adobe-user-group-granada.es/?p=989</guid>
		<description><![CDATA[TwitPic es un servicio que se utiliza para subir fotos que luego publicas en Twitter. Si estás realizando una aplicación que tira de Twitter y quieres dar la oportunidad al usuario de subir sus fotos puedes hacer uso de esta aplicación y su API (es necesario darse de alta):


$twitpic = new TwitPic($api_key, $consumer_key, $consumer_secret, $oauth_token, [...]]]></description>
			<content:encoded><![CDATA[<p>TwitPic es un servicio que se utiliza para subir fotos que luego publicas en Twitter. Si estás realizando una aplicación que tira de Twitter y quieres dar la oportunidad al usuario de subir sus fotos puedes hacer uso de esta aplicación y su API (es necesario darse de alta):</p>
<p><span id="more-989"></span></p>
<p><code></p>
<pre>$twitpic = new TwitPic($api_key, $consumer_key, $consumer_secret, $oauth_token, $oauth_secret);
try {
  /*
  * Retrieves all images where the user is facetagged
  */
  $user = $twitpic-&gt;faces-&gt;show(<a href="http://www.php.net/array">array</a>('user'=&gt;'meltingice'));
  <a href="http://www.php.net/print_r">print_r</a>($user-&gt;images);

  $media = $twitpic-&gt;media-&gt;show(<a href="http://www.php.net/array">array</a>('id'=&gt;1234));
  <a href="http://www.php.net/echo">echo</a> $media-&gt;message;

  $user = $twitpic-&gt;users-&gt;show(<a href="http://www.php.net/array">array</a>('username'=&gt;'meltingice'), <a href="http://www.php.net/array">array</a>('process'=&gt;false, 'format'=&gt;'xml'));
  <a href="http://www.php.net/echo">echo</a> $user; // raw XML response data

  /*
  * Uploads an image to TwitPic
  */
  $resp = $twitpic-&gt;upload(<a href="http://www.php.net/array">array</a>('media'=&gt;'path/to/file.jpg', 'message'=&gt;'This is an example'));
  <a href="http://www.php.net/print_r">print_r</a>($resp);

  /*
  * Uploads an image to TwitPic AND posts a tweet
  * to Twitter.
  *
  * NOTE: this still uses v2 of the TwitPic API. This means that the code makes 2 separate
  * requests: one to TwitPic for the image, and one to Twitter for the tweet. Because of this,
  * understand this call may take a bit longer than simply uploading the image.
  */
  $resp = $twitpic-&gt;uploadAndPost(<a href="http://www.php.net/array">array</a>('media'=&gt;'path/to/file.jpg', 'message'=&gt;'Another example'));
  <a href="http://www.php.net/print_r">print_r</a>($resp);

} catch (TwitPicAPIException $e) {
  <a href="http://www.php.net/echo">echo</a> $e-&gt;getMessage();
}</pre>
<p></code><br />
<a href="https://github.com/meltingice/TwitPic-API-for-PHP">TwitPic API for PHP</a></p>
<p>Nuestra fuente: <a title="Libreria PHP para TwitPic" href="http://sentidoweb.com/2011/05/31/libreria-php-para-twitpic.php?utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed%3A+sentidoweb+%28Sentido+Web%29&amp;utm_content=Google+International" target="_blank">Sentidoweb</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.adobe-user-group-granada.es/libreria-php-para-twitpic/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Subir y exportar documentos usando Google Docs y PHP</title>
		<link>http://www.adobe-user-group-granada.es/subir-y-exportar-documentos-usando-google-docs-y-php/</link>
		<comments>http://www.adobe-user-group-granada.es/subir-y-exportar-documentos-usando-google-docs-y-php/#comments</comments>
		<pubDate>Fri, 01 Apr 2011 09:17:33 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[tutoriales]]></category>
		<category><![CDATA[google]]></category>

		<guid isPermaLink="false">http://www.adobe-user-group-granada.es/?p=957</guid>
		<description><![CDATA[Uno de los problemas con los que nos podemos encontrar es tener un documento en un formato y tener que exportarlo en otro formato. La exportación se puede realizar utilizando Google Docs, quizás un tanto rebuscada la solución, aunque quizás no tanto.
Os paso un script que sube el fichero a Google Docs dentro de una [...]]]></description>
			<content:encoded><![CDATA[<p>Uno de los problemas con los que nos podemos encontrar es tener un documento en un formato y tener que exportarlo en otro formato. La exportación se puede realizar utilizando Google Docs, quizás un tanto rebuscada la solución, aunque quizás no tanto.</p>
<p>Os paso un script que sube el fichero a Google Docs dentro de una carpeta y acto seguido lo exporta a otro formato, en este caso subo un PPT y lo convierto en PDF (me hubiese encantado que fuera a HTML pero no acepta esa opción).</p>
<p><span id="more-957"></span></p>
<pre><code>
// Datos de login a la API de Google
$clientlogin_url = "https://www.google.com/accounts/ClientLogin";
$clientlogin_post = <a href="http://www.php.net/array">array</a>(
    "accountType" =&gt; "GOOGLE",
    "Email" =&gt; "miemail@gmail.com",
    "Passwd" =&gt; "mipassword",
    "service" =&gt; "writely",
    "source" =&gt; "WPDOCS"
);

// Inicializamos el CURL
$curl = curl_init($clientlogin_url);

// Obtenemos el string de autenticaciÃ³n
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $clientlogin_post);
curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($curl);
<a href="http://www.php.net/preg_match">preg_match</a>("/Auth=([a-z0-9_\-]+)/i", $response, $matches);
$auth = $matches[1];

// Cabeceras de autenticaciÃ³n
$headers = <a href="http://www.php.net/array">array</a>(
    "Authorization: GoogleLogin auth=" . $auth,
    "GData-Version: 3.0",
);

// Recuperamos los ficheros y carpetas que tenemos en Google Docs para no crear dos veces la misma carpeta
curl_setopt($curl, CURLOPT_URL, "http://docs.google.com/feeds/default/private/full?showfolders=true");
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_POST, false);
$listado = curl_exec($curl);
$nombre_carpeta = 'WPDOCS';

// Si no se ha creado la carpeta, la creamos
if (<a href="http://www.php.net/strpos">strpos</a>($listado, '&lt;title&gt;'.$nombre_carpeta.'&lt;/title&gt;') === FALSE) {
  // Make the request
  $h = <a href="http://www.php.net/array_merge">array_merge</a>($headers,<a href="http://www.php.net/array">array</a>('Content-Type: application/atom+xml'));
  $xml = '&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;entry xmlns="http://www.w3.org/2005/Atom"&gt;&lt;category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/docs/2007#folder"/&gt;&lt;title&gt;'.$nombre_carpeta.'&lt;/title&gt;&lt;/entry&gt;';
  curl_setopt($curl, CURLOPT_URL, "http://docs.google.com/feeds/default/private/full");
  curl_setopt($curl, CURLOPT_HTTPHEADER, $h);
  curl_setopt($curl, CURLOPT_POSTFIELDS, $xml);
  curl_setopt($curl, CURLOPT_POST, true);

  $response = curl_exec($curl);
  $response = simplexml_load_string($response);
  $id_folder = $response-&gt;id;
} else {
  // Recuperamos la ID de la carpeta creada anteriormente
  <a href="http://www.php.net/preg_match">preg_match</a>("#&lt;title&gt;$nombre_carpeta&lt;/title&gt;&lt;content type='application/atom\+xml;type=feed' src='([^']+)'#", $listado, $m);
  $id_folder = $m[1];
}

// Subimos el PPT
$h = <a href="http://www.php.net/array_merge">array_merge</a>($headers,<a href="http://www.php.net/array">array</a>('Content-Type: application/vnd.ms-powerpoint', 'Slug: fichero'));
$filepath='/path/fichero.ppt';
$data=((<a href="http://www.php.net/fread">fread</a>(<a href="http://www.php.net/fopen">fopen</a>($filepath, "rb"), <a href="http://www.php.net/filesize">filesize</a>($filepath))));
curl_setopt($curl, CURLOPT_URL, "http://docs.google.com/feeds/default/private/full");
curl_setopt($curl, CURLOPT_HTTPHEADER, $h);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl, CURLOPT_POST, true);
$response = curl_exec($curl);
$response = simplexml_load_string($response);
$id_doc = $response-&gt;id;

// Limpiamos los IDs de los ficheros devueltos por Google, solo nos interesa del %3A para adelante
<a href="http://www.php.net/preg_match">preg_match</a>('/%3A(.+)/', $id_doc, $m);
$id_doc = $m[1];
<a href="http://www.php.net/preg_match">preg_match</a>('/%3A(.+)/', $id_folder, $m);
$id_folder = $m[1];

// Lo movemos a la carpeta
$h = <a href="http://www.php.net/array_merge">array_merge</a>($headers,<a href="http://www.php.net/array">array</a>('Content-Type: application/atom+xml'));
$data = '&lt;?xml version=\'1.0\' encoding=\'UTF-8\'?&gt;&lt;entry xmlns="http://www.w3.org/2005/Atom"&gt;&lt;id&gt;https://docs.google.com/feeds/default/private/full/document%3A'.$id_doc.'&lt;/id&gt;&lt;/entry&gt;';
curl_setopt($curl, CURLOPT_URL, "http://docs.google.com/feeds/default/private/full/folder%3A".$id_folder);
curl_setopt($curl, CURLOPT_HTTPHEADER, $h);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl, CURLOPT_POST, true);
$response = curl_exec($curl);

//header('Content-type: text/xml');
//echo $response;
// Parse the response

// Exportamos a HTML
curl_setopt($curl, CURLOPT_URL, "http://docs.google.com/feeds/download/presentations/Export?docID=$id_doc&amp;exportFormat=pdf");
curl_setopt($curl, CURLOPT_HTTPHEADER, $h);
curl_setopt($curl, CURLOPT_POST, false);
<a href="http://www.php.net/header">header</a>('Content-type: application/pdf');
<a href="http://www.php.net/echo">echo</a> curl_exec($curl);

curl_close($curl);</code></pre>
<p>Nuestra fuente: <a href="http://sentidoweb.com/2011/03/27/subir-y-exportar-documentos-usando-google-docs-y-php.php?utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed%3A+sentidoweb+%28Sentido+Web%29&amp;utm_content=Google+International" target="_blank">Sentidoweb</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.adobe-user-group-granada.es/subir-y-exportar-documentos-usando-google-docs-y-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ejecutar código PHP desde linea de comandos</title>
		<link>http://www.adobe-user-group-granada.es/ejecutar-codigo-php-desde-linea-de-comandos/</link>
		<comments>http://www.adobe-user-group-granada.es/ejecutar-codigo-php-desde-linea-de-comandos/#comments</comments>
		<pubDate>Thu, 17 Feb 2011 10:34:10 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[artículos]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.adobe-user-group-granada.es/?p=937</guid>
		<description><![CDATA[En algunas ocasiones se pueden encontrar ejemplos de cosas sobrecomplicadas, un ejemplo es como ejecutar código PHP desde linea de comandos.
Es evidente que si queremos ejecutar un script PHP lo podemos hacer mediante unwget al fichero si esta colgado en un servidor web:

#!/bin/bash
wget http://ejemplo.com/scripts/ejemplo.php
rm ejemplo.php
Pero no hace falta tenerlo en el servidor web para poder ejecutarlo, por ejemplo:
&#60;?php
 [...]]]></description>
			<content:encoded><![CDATA[<p>En algunas ocasiones se pueden encontrar ejemplos de cosas <strong>sobrecomplicadas</strong>, un ejemplo es como ejecutar código <strong>PHP desde linea de comandos</strong>.<br />
Es evidente que si queremos ejecutar un <strong>script PHP</strong> lo podemos hacer mediante un<strong>wget</strong> al fichero si esta colgado en un servidor web:</p>
<p><span id="more-937"></span></p>
<pre>#!/bin/bash
wget http://ejemplo.com/scripts/ejemplo.php
rm ejemplo.php</pre>
<p>Pero no hace falta tenerlo en el servidor web para poder ejecutarlo, por ejemplo:</p>
<pre>&lt;?php
        echo "hola desde PHP\n";
?&gt;</pre>
<p>Si usamos el comando <strong>php</strong> desde linea de comandos y le pasamos el <strong>script</strong> lo estaremos ejecutando:</p>
<pre># php ejemplo1.php
hola desde PHP</pre>
<p>Si en el script además le añadimos el <strong>shebang</strong> con el path completo al binario de<strong>php</strong>:</p>
<pre>#!/usr/local/bin/php
&lt;?php
        echo "hola desde PHP\n";
?&gt;</pre>
<p>Podremos simplemente darle permisos de ejecución y ejecutarlo:</p>
<pre># chmod +x ejemplo2.php
# ./ejemplo2.php
hola desde PHP</pre>
<p>Nuestra fuente: <a href="http://systemadmin.es/2009/11/ejecutar-codigo-php-desde-linea-de-comandos" target="_blank">systemadmin.es</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.adobe-user-group-granada.es/ejecutar-codigo-php-desde-linea-de-comandos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Acortar URLs mediante goo.gl y PHP</title>
		<link>http://www.adobe-user-group-granada.es/acortar-urls-mediante-goo-gl-y-php/</link>
		<comments>http://www.adobe-user-group-granada.es/acortar-urls-mediante-goo-gl-y-php/#comments</comments>
		<pubDate>Fri, 21 Jan 2011 10:16:34 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[artículos]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[enlaces]]></category>
		<category><![CDATA[google]]></category>

		<guid isPermaLink="false">http://www.adobe-user-group-granada.es/?p=929</guid>
		<description><![CDATA[La API de Google para acortar URLs permite acortar URLs, recuperar info del link original y las URLs  acortadas de un usuario, aunque para usarlo se necesita crear una clave y  dar de alta proyecto.
El resto es fácil, acceso mediante CURL y listo:
    define('GOOGLE_API_KEY', '[insert your key here]');
   [...]]]></description>
			<content:encoded><![CDATA[<p>La <a href="http://code.google.com/apis/urlshortener/index.html">API de Google para acortar URLs</a> permite acortar URLs, recuperar info del link original y las URLs  acortadas de un usuario, aunque para usarlo se necesita crear una clave y  dar de alta proyecto.<span id="more-929"></span></p>
<p>El resto es fácil, acceso mediante CURL y listo:</p>
<pre>    <a href="http://www.php.net/define">define</a>('GOOGLE_API_KEY', '[insert your key here]');
    <a href="http://www.php.net/define">define</a>('GOOGLE_ENDPOINT', 'https://www.googleapis.com/urlshortener/v1');

    function shortenUrl($longUrl)
    {
        // initialize the cURL connection
        $ch = curl_init(
            <a href="http://www.php.net/sprintf">sprintf</a>('%s/url?key=%s', GOOGLE_ENDPOINT, GOOGLE_API_KEY)
        );

        // tell cURL to return the data rather than outputting it
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

        // create the data to be encoded into JSON
        $requestData = <a href="http://www.php.net/array">array</a>(
            'longUrl' =&gt; $longUrl
        );

        // change the request type to POST
        curl_setopt($ch, CURLOPT_POST, true);

        // set the form content type for JSON data
        curl_setopt($ch, CURLOPT_HTTPHEADER, <a href="http://www.php.net/array">array</a>('Content-type: application/json'));

        // set the post body to encoded JSON data
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($requestData));

        // perform the request
        $result = curl_exec($ch);
        curl_close($ch);

        // decode and return the JSON response
        return json_decode($result, true);
    }

    $response = shortenUrl('http://phpriot.com');

    <a href="http://www.php.net/echo">echo</a> <a href="http://www.php.net/sprintf">sprintf</a>(
        '%s was shortened to %s',
        $response['longUrl'],
        $response['id']
    );
</pre>
<p>Nuestra fuente: <a href="http://sentidoweb.com/2011/01/18/acortar-urls-mediante-goo-gl-y-php.php?utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed%3A+sentidoweb+%28Sentido+Web%29&amp;utm_content=Google+International" target="_blank">Sentidoweb</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.adobe-user-group-granada.es/acortar-urls-mediante-goo-gl-y-php/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Deshabilitar PHP para un directorio concreto</title>
		<link>http://www.adobe-user-group-granada.es/deshabilitar-php-para-un-directorio-concreto/</link>
		<comments>http://www.adobe-user-group-granada.es/deshabilitar-php-para-un-directorio-concreto/#comments</comments>
		<pubDate>Mon, 17 Jan 2011 11:58:32 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[artículos]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programación]]></category>

		<guid isPermaLink="false">http://www.adobe-user-group-granada.es/?p=927</guid>
		<description><![CDATA[Existen partes dentro de cualquier aplicación dónde sólo existen ficheros de imágenes o vídeos dónde nunca debe ejecutarse un fichero PHP. Vamos a ver como deshabilitar el PHP por directorio:
Para deshabilitar PHP deberemos usar la directiva php_admin_flag con la opciónengine a off dentro del Directory que indiquemos:
	&#60;Directory "/var/systemadmin.es/htdocs/images"&#62;
		php_admin_flag engine off
	&#60;/Directory&#62;
De esta forma, aunque un usuario sea capaz de subir código en [...]]]></description>
			<content:encoded><![CDATA[<p>Existen partes dentro de cualquier aplicación dónde sólo existen ficheros de imágenes o vídeos dónde nunca debe ejecutarse un fichero <strong>PHP</strong>. Vamos a ver como <strong>deshabilitar el PHP</strong> por directorio:</p>
<p>Para <strong>deshabilitar PHP</strong> deberemos usar la directiva <strong>php_admin_flag</strong> con la opción<strong>engine</strong> a <strong>off</strong> dentro del <strong>Directory</strong> que indiquemos:</p>
<pre>	&lt;Directory "/var/systemadmin.es/htdocs/images"&gt;
		php_admin_flag engine off
	&lt;/Directory&gt;</pre>
<p>De esta forma, aunque un usuario sea capaz de subir código en la carpeta de imágenes por algún fallo en el control, el <strong>código PHP</strong> nunca se ejecutará y en su lugar se servirá como texto plan e inofensivo.</p>
<p>Nuestra fuente: <a href="http://systemadmin.es/2010/08/deshabilitar-php-para-un-directorio-concreto" target="_blank">Systemadmin.es</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.adobe-user-group-granada.es/deshabilitar-php-para-un-directorio-concreto/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>NUEVOS eSEMINARIOS CSS + PHP + jQuery</title>
		<link>http://www.adobe-user-group-granada.es/nuevos-eseminarios-css-php-jquery/</link>
		<comments>http://www.adobe-user-group-granada.es/nuevos-eseminarios-css-php-jquery/#comments</comments>
		<pubDate>Thu, 28 Oct 2010 10:27:30 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[eventos]]></category>
		<category><![CDATA[cs5]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[dreamweaver]]></category>
		<category><![CDATA[frameworks]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.adobe-user-group-granada.es/?p=881</guid>
		<description><![CDATA[Maqueta, Programa y Enriquece tus aplicaciones web. &#8211; 11 de Noviembre a las 19.30h GMT+1 (Clase 2/2 CSS)

En este eSeminario te mostraremos como comenzar a trabajar con las hojas de estilo de forma profesional. Desde los conceptos básicos hasta utilizar Frameworks para la maquetación CSS. Además podrás aprender las bases del lenguaje PHP para poder [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Maqueta, Programa y Enriquece tus aplicaciones web. &#8211; 11 de Noviembre a las 19.30h GMT+1 (Clase 2/2 CSS)<br />
</strong></p>
<p>En este eSeminario te mostraremos como comenzar a trabajar con las hojas de estilo de forma profesional. Desde los conceptos básicos hasta utilizar Frameworks para la maquetación CSS. Además podrás aprender las bases del lenguaje PHP para poder aplicar este lenguaje de Script a tus páginas web. Finalmente aprenderás a enriquecer tus aplicaciones mediante uno de los frameworks, más utilizados,  de Javascript “jQuery”. Todo esto utilizando como IDE el Adobe Dreamweaver CS5.</p>
<p>Únete a esta serie de eSeminarios y aprende junto al Adobe User Group Granada y el <a href="http://www.maug.es/" target="_blank">Mediterranean Adobe User Group</a>.</p>
<p>Ah y recuerda <strong>regalaremos 2 </strong><strong>Adobe Creative Suite CS5</strong> a escoger entre la versión Design, Web y Production entre todos los que participen activamente durante el eSeminario. Las bases de este regalo, se darán a conocer en nuestro Moodle.</p>
<div>
<p><strong>¡La inscripción es gratuita! No te lo pienses más, regístrate para asistir desde donde más te convenga, sólo necesitas conexión a Internet y tener Flash Player instalado.</strong></p>
</div>
<p><a href="http://moodle.adobe-user-group-granada.es" target="_blank">+información y registro</a></p>
<p><span style="text-decoration: underline;"><strong>FAQ´s</strong></span></p>
<p><strong>A quién esta dirigido?</strong><br />
A diseñadores web, diseñadores gráficos, programadores junior de php u otro lenguaje y todo aquel que desee aprender</p>
<p><strong>Como puedo asistir?</strong><br />
Desde cualquier lugar en el que te encuentres. Sólo necesitas un navegador con<strong>Adobe Flash Player</strong>. La url de acceso se informara días previos al comienzo.</p>
<p><strong>Cuando?</strong><br />
El comienzo de los webinars será el día <strong>11 de noviembre</strong> a las a las <strong>19.30hs</strong> UTC+1 hours CEST</p>
<p><strong>Vivo fuera de España como se el horario correcto?</strong><br />
Puedes visitar la siguiente url: <a href="http://bit.ly/cPbBU7" target="_blank">http://bit.ly/cPbBU7</a></p>
<p><strong>Cual es la duración de estos webinars?</strong><br />
Cada webinar tiene una duración estimada de 45″ a 60″</p>
<p><strong>Cuanto Cuesta?</strong><br />
Es totalmente <strong>GRATIS!</strong></p>
<p><strong>De donde puedo bajar la demo de la suite?</strong><br />
La url para descargar la suite es: <a href="http://bit.ly/buycs5_sp" target="_blank">http://bit.ly/buycs5_sp</a> <span style="font-weight: bold;"><span style="font-weight: normal;">importante</span></span>:recomendamos hacerlo cuando comience el eSeminario a efectos de que no se caduque la demo.</p>
<p><strong>Se emitirá algún tipo de certificado?</strong><br />
No</p>
<p><strong>Se podrá bajar el material e intercambiar preguntas luego de cada clase?</strong><br />
Dispondremos de una plataforma <a href="http://moodle.adobe-user-group-granada.es/" target="_blank">Moodle </a>para el seguimiendo de todo el curso.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.adobe-user-group-granada.es/nuevos-eseminarios-css-php-jquery/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Gratis eSeminarios para aprender CSS, PHP y jQuery</title>
		<link>http://www.adobe-user-group-granada.es/gratis-eseminarios-para-aprender-css-php-y-jquery/</link>
		<comments>http://www.adobe-user-group-granada.es/gratis-eseminarios-para-aprender-css-php-y-jquery/#comments</comments>
		<pubDate>Fri, 15 Oct 2010 15:38:56 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[eventos]]></category>
		<category><![CDATA[adobe]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[dreamweaver]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.adobe-user-group-granada.es/?p=873</guid>
		<description><![CDATA[Se abre la inscripción a los próximos eSeminarios del Adobe User Group Granada.
Más información en el Moodle del AUGG
]]></description>
			<content:encoded><![CDATA[<p>Se abre la inscripción a los próximos eSeminarios del Adobe User Group Granada.</p>
<p>Más información en el <a href="http://moodle.adobe-user-group-granada.es" target="_blank">Moodle del AUGG</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.adobe-user-group-granada.es/gratis-eseminarios-para-aprender-css-php-y-jquery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Librería PHP para evitar SQL injection y XSS</title>
		<link>http://www.adobe-user-group-granada.es/libreria-php-para-evitar-sql-injection-y-xss/</link>
		<comments>http://www.adobe-user-group-granada.es/libreria-php-para-evitar-sql-injection-y-xss/#comments</comments>
		<pubDate>Thu, 12 Aug 2010 16:27:24 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[artículos]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.adobe-user-group-granada.es/?p=852</guid>
		<description><![CDATA[Algo que debemos tener muy en cuenta cuando realizamos nuestra  aplicación web es limpiar la entrada de datos de contenido malicioso, ya  sea para SQL injection o cross-site scripting (XSS). Los frameworks  suelen tener su propia librería que se encarga de ello, pero para  aquellos que no usen framework o hagan [...]]]></description>
			<content:encoded><![CDATA[<p>Algo que debemos tener muy en cuenta cuando realizamos nuestra  aplicación web es limpiar la entrada de datos de contenido malicioso, ya  sea para SQL injection o cross-site scripting (XSS). Los frameworks  suelen tener su propia librería que se encarga de ello, pero para  aquellos que no usen framework o hagan una aplicación muy sencilla, esta  librería les vendrá muy bien.</p>
<p><span id="more-852"></span></p>
<pre>// Output an unsafe string, presumably user input
$xss = '&lt;script&gt;alert(\'oh snap\');&lt;/script&gt;';
<a href="http://www.php.net/echo">echo</a> 'If your entered your name as ' . $xss . ', we\'d be in trouble.&lt;br&gt;' . "\n";

// Sanitize that string, and output it safely
$htmlContentContext = sgSanitizer::sanitizeForHTMLContent($xss);
<a href="http://www.php.net/echo">echo</a> "But if we sanitize your name, " . $htmlContentContext . ", then all is well.&lt;br&gt;\n";</pre>
<p>Nuestra fuente: <a href="http://sentidoweb.com/2010/08/04/libreria-php-pare-evitar-sql-injection-y-xss.php" target="_blank">Sentidoweb</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.adobe-user-group-granada.es/libreria-php-para-evitar-sql-injection-y-xss/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Preparando la PHP Barcelona Conference 2010</title>
		<link>http://www.adobe-user-group-granada.es/preparando-la-php-barcelona-conference-2010/</link>
		<comments>http://www.adobe-user-group-granada.es/preparando-la-php-barcelona-conference-2010/#comments</comments>
		<pubDate>Thu, 22 Jul 2010 08:04:21 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[eventos]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.adobe-user-group-granada.es/?p=841</guid>
		<description><![CDATA[El evento se celebrará los próximos 22 y 23 de octubre. En cada una de las anteriores ediciones todos los involucrados en el  evento les han ido poniendo el listón un poco más alto hasta que  gracias al esfuerzo de todos, sobretodo al de los asistentes, han  consolidado la PHP Barcelona Conference [...]]]></description>
			<content:encoded><![CDATA[<p>El evento se celebrará los próximos 22 y 23 de octubre. En cada una de las anteriores ediciones todos los involucrados en el  evento les han ido poniendo el listón un poco más alto hasta que  gracias al esfuerzo de todos, sobretodo al de los asistentes, han  consolidado la PHP Barcelona Conference dentro del panorama mundial de  conferencias dedicadas al PHP.</p>
<p><span id="more-841"></span></p>
<p>Como el año pasado será un evento de dos días de duración (Viernes y  Sábado) con distintas actividades entremezcladas (ponencias teóricas,  talleres prácticos, esta vez sí algún concurso de programación, etc.),  dos líneas de idioma (español e inglés), nuevos y potentes  patrocinadores, todavía más celebridades invitadas, divertidos regalos y  por supuesto como siempre, ¡mucho networking!</p>
<p>Aunque la agenda todavía no está cerrada pueden avanzar que volveran a  contar con grandes del mundillo PHP que ya han ido en anteriores  ediciones, como <strong>Derick Rethans</strong> o <strong>Fabien Potencier</strong>, y muchos otros nuevos que anunciarán en las siguientes semanas.</p>
<p>Nuestra fuente, y más información en: <a href="http://phpbarcelona.org/preparando-la-php-barcelona-conference-2010" target="_blank">phpbarcelona.org</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.adobe-user-group-granada.es/preparando-la-php-barcelona-conference-2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

