Ajustes de proxy en PHP

321 views
Skip to first unread message

Osukaru

unread,
Sep 13, 2011, 6:42:03 AM9/13/11
to symfony...@googlegroups.com
Escribo esto en la lista de symfony-madrid porque recuerdo que en alguna meetup había alguien que trabajaba con Symfony en algún ministerio y seguro que ha tenido este problema y lo ha solucionado. Si no sabe solucionarlo nadie ya escribiré en otra lista de Symfony o de PHP :)

El tema es que en el cliente en el que estoy todas las peticiones web externas http se realizan a través de un proxy con autentificación. Se pueden configurar el sistema operativo o el navegador con los datos del proxy, pero a PHP le da un poco igual esto y si intentas hacer un file_get_contents("http://www.unapagina.es/prueba.xsl") o un SoapClient("http://www.unapagina.es/info.wso?wsdl") te dice que no puede acceder al recurso.

En el caso del SoapClient, por ejemplo, puedes pasar como segundo parámetro un array con los datos del proxy:

  $client = new SoapClient("http://www.unapagina.es/info.wso?wsdl",
                                      array('proxy_host'     => "proxy.host.es",
                                            'proxy_port'     => 8080,
                                            'proxy_login'    => "miusuario",
                                            'proxy_password' => "mipassword"));

Y funcionaría. Con el file_get_contents tengo que investigar la manera de hacerlo pero también se puede.

El problema es que yo no quiero hacer esto. Yo no quiero que mi código PHP dependa de si estoy bajo un proxy o no. Es más, si yo utilizara una librería de un tercero que usa un SoapClient o un file_get_contents o alguna otra función que acceda a recursos externos, no funcionaría en mi entorno de trabajo.

Entonces mi pregunta es, ¿hay alguna forma de configurar mi entorno de desarrollo local para que mis proyectos PHP funcionen como si no hubiera proxy? Lo ideal sería en el php.ini, no sé si habrá alguna parametrización para eso, porque yo no la encuentro. También he visto alguna solución con un "http tunnel", pero ni la entiendo bien no sé si es la adecuada. ¿Alguna idea?

daniel....@freelancemadrid.es

unread,
Sep 13, 2011, 7:42:22 AM9/13/11
to symfony...@googlegroups.com
2011/9/13 Osukaru <zepol...@gmail.com>:

>
> Entonces mi pregunta es, ¿hay alguna forma de configurar mi entorno de
> desarrollo local para que mis proyectos PHP funcionen como si no hubiera
> proxy? Lo ideal sería en el php.ini, no sé si habrá alguna parametrización
> para eso, porque yo no la encuentro. También he visto alguna solución con un
> "http tunnel", pero ni la entiendo bien no sé si es la adecuada. ¿Alguna
> idea?
>

Parece que no, en [1] dicen:

This extension has no configuration directives defined in php.ini.

y en [2] no definen nada tampoco

[1] http://www.php.net/manual/en/curl.configuration.php
[2] http://www.php.net/manual/en/soap.configuration.php

Tu proyecto tendrá que tener un fichero de configuración donde definas
esos parametros ...

--
-------------------------------------------------------------------------------------
Daniel González Cerviño
Open Source Developer http://desarrolla2.com
Tel (+34) 653 96 50 48
Mail daniel....@freelacemadrid.es
Twiter: @desarrolla2
Linkedin: http://es.linkedin.com/in/danielgonzalezcervino
-------------------------------------------------------------------------------------

Oscar López Carazo

unread,
Sep 13, 2011, 9:01:59 AM9/13/11
to symfony...@googlegroups.com
Ya veo, pero es que configurar mi proyecto con el proxy no es una opción muy válida. En primer lugar, estos problemas sólo aparecen en el servidor local, es decir, usando el apache y el php de mi máquina de desarrollo que es la que está bajo el proxy. Así que andar metiendo código en mi proyecto que sólo sirve para probar en local es un poco chapuza. Además seguiría teniendo el mismo problema con las librerías de terceros, tendría que modificarlas para añadirles la configuración del proxy. Ciertamente, me desespera bastante que este problema no tenga una solución sencilla. La única opción que me queda es usar un servidor externo para el entorno de desarrollo, pero es un poco coñazo tener que andar subiendo código cada vez que haces un cambio para poder probarlo...

daniel....@freelancemadrid.es

unread,
Sep 13, 2011, 10:30:43 AM9/13/11
to symfony...@googlegroups.com
2011/9/13 Oscar López Carazo <zepol...@gmail.com>:

> Ya veo, pero es que configurar mi proyecto con el proxy no es una opción muy
> válida. En primer lugar, estos problemas sólo aparecen en el servidor local,
> es decir, usando el apache y el php de mi máquina de desarrollo que es la
> que está bajo el proxy. Así que andar metiendo código en mi proyecto que
> sólo sirve para probar en local es un poco chapuza. Además seguiría teniendo
> el mismo problema con las librerías de terceros, tendría que modificarlas
> para añadirles la configuración del proxy. Ciertamente, me desespera
> bastante que este problema no tenga una solución sencilla. La única opción
> que me queda es usar un servidor externo para el entorno de desarrollo, pero
> es un poco coñazo tener que andar subiendo código cada vez que haces un
> cambio para poder probarlo...
>

Todos los proyectos tienen ficheros de configuración, no veo tan grave
añadir un par de valores más.
Si lo quieres hacer limpio, permite que si no se expecifican los
valores del proxy, el sistema por defecto no use proxy.

Añadir código para reflejar situaciones no muy frecuentes ( como estar
detras de un proxy ), hace el código más generico, no más sucio.

Si utilizas symfony ( en cualquiera de sus versiones ), puedes
utilizar los entornos para gestionar esta configuración.

No?¿

Juan Antonio López

unread,
Sep 13, 2011, 11:21:19 AM9/13/11
to symfony...@googlegroups.com
Yo optaría también por ponerlo en el config, pero imagino que alguna de estas opciones te pueden valer,

a) proxy transparente en tu máquina con squid y con iptables todo lo que vaya al puerto 80 (con ip distinta de tu servidor web) lo rediriges al proxy. Me imagino que eso funcionaria pero será un coñazo configurarlo.

b) Si tienes el proxy en el entorno lo puedes capturar y ponerlo donde hagas la llamada soap, algo asi

    $proxy = system(" env | grep http_proxy")

   $client = new SoapClient("http://www.unapagina.es/info.wso?wsdl",                              
        array('proxy_host'     => "proxy.host.es", 'proxy_port'     => $proxy);


Un saludo
--
Juan Antonio López Carreño


--------------------------------------------------------------
Reply all
Reply to author
Forward
0 new messages