{"id":17,"date":"2026-08-06T09:37:58","date_gmt":"2026-08-06T12:37:58","guid":{"rendered":"https:\/\/freeanimationpower.org\/blog\/?p=17"},"modified":"2026-08-07T18:29:11","modified_gmt":"2026-08-07T21:29:11","slug":"proxies_php_magia_tecnica","status":"publish","type":"post","link":"https:\/\/freeanimationpower.org\/blog\/proxies_php_magia_tecnica\/","title":{"rendered":"Los Proxies PHP: La Magia Tecnica que Conecta el Frontend con el Mundo"},"content":{"rendered":"<p>Toda herramienta de IA en Free Animation Power necesita comunicarse con APIs externas: OpenAI, Gemini, DeepSeek, Mistral, Groq, Pollinations. Cada una con su propio esquema de autenticacion, su formato de respuesta y, lo mas problematico, sus restricciones CORS. La solucion no fue Node.js &#8212; Hostinger no lo soporta en planes compartidos &#8212; sino proxies PHP. Resulto ser la mejor decision arquitectonica del ecosistema.<\/p>\n<h2>El Problema CORS y la Solucion Proxy<\/h2>\n<p>Imagina un <code>fetch()<\/code> desde <code>freeanimationpower.org<\/code> directo a <code>api.openai.com<\/code>. El navegador lo bloquea. Necesitas un intermediario que reciba la peticion del frontend, la reenvie al destino real y devuelva la respuesta con <code>Access-Control-Allow-Origin: *<\/code>. Ese intermediario es el proxy, implementado en PHP puro con cURL.<\/p>\n<h2>chat.php: 52 Lineas, Infinitas Posibilidades<\/h2>\n<p><code>chat.php<\/code> hace exactamente cuatro cosas:<\/p>\n<ul>\n<li>Recibe una solicitud POST desde el frontend.<\/li>\n<li>Lee dos headers personalizados: <code>x-target-url<\/code> (URL de la API destino) y <code>x-api-key<\/code> (clave de autenticacion).<\/li>\n<li>Reenvia el cuerpo completo &#8212; prompts, temperatura, tokens maximos &#8212; via <code>curl_exec()<\/code>.<\/li>\n<li>Devuelve la respuesta en streaming o bloque con headers CORS.<\/li>\n<\/ul>\n<p>Timeout: 120 segundos. Suficiente para que modelos como GPT-4o procesen prompts largos sin que la conexion se caiga. El frontend no sabe ni necesita saber si esta hablando con OpenAI, Gemini o Mistral. Es polimorfismo a nivel HTTP: misma interfaz, multiples backends.<\/p>\n<h2>img.php: El Detective de Formatos<\/h2>\n<p>Si <code>chat.php<\/code> es elegante por minimalismo, <code>img.php<\/code> es fascinante por inteligencia. 120 lineas que detectan automaticamente el formato de respuesta de cada API:<\/p>\n<ul>\n<li><strong>DALL-E<\/strong>: devuelve JSON con URL a la imagen.<\/li>\n<li><strong>Gemini<\/strong>: puede devolver base64 dentro del JSON.<\/li>\n<li><strong>HuggingFace<\/strong>: responde con blob binario.<\/li>\n<li><strong>Pollinations<\/strong>: stream binario directo.<\/li>\n<\/ul>\n<p><code>img.php<\/code> parsea JSON si lo recibe y extrae URL o base64. Si recibe bytes binarios, los reenvia tal cual. El frontend siempre obtiene una imagen renderizable sin importar que API la genero. La complejidad queda encapsulada en el proxy.<\/p>\n<h2>La Migracion que Defini\u00f3 el Ecosistema<\/h2>\n<p>El plan original era Node.js con Express. Hostinger dijo que no. Lo que parecia una limitacion se convirtio en ventaja: PHP con cURL es mas simple, mas rapido de desplegar y mas facil de mantener. Sin <code>node_modules<\/code>. Sin <code>package.json<\/code>. Sin reiniciar procesos. PHP es stateless por definicion: cada solicitud es un universo independiente que nace y muere en milisegundos. Para un proxy, exactamente lo que necesitas.<\/p>\n<h2>La Capa REST Auxiliar<\/h2>\n<p><code>register.php<\/code> recibe POST con emails y persiste via PDO con <code>INSERT IGNORE<\/code>. <code>logout.php<\/code> ejecuta <code>session_destroy()<\/code> y redirige. Cada archivo es autocontenido: sin routers, sin controladores, un endpoint, un proposito.<\/p>\n<p>La leccion mas importante del Hub es esta: las limitaciones son catalizadores de creatividad. Sin Node.js, PHP. Sin frameworks, vanilla. El resultado, medido en funcionalidad entregada por linea de codigo, supera al 90% de las aplicaciones que dependen de 300 paquetes npm. Los proxies PHP &#8212; 172 lineas combinadas entre chat e img &#8212; son el sistema nervioso del ecosistema Free Animation Power. Transportan se\u00f1ales entre tu frontend y las inteligencias artificiales del mundo. Y lo hacen sin fallar.<\/p>\n<hr \/>\n<p><strong>Hashtags:<\/strong> #proxiesPHP #PHPproxy #cURL #CORSsolution #APIgateway #APIIntegration #OpenAI #Gemini #DeepSeek #Mistral #Groq #Pollinations #DALL_E #HuggingFace #chatAPI #imageAPI #streamingAPI #sinNodeJS #noNodeJS #statelessPHP #sinEstado #contentTypeNegotiation #xTargetUrl #xApiKey #customHeaders #AccessControlAllowOrigin #chatPHP #imgPHP #registerPHP #logoutPHP #RESTauxiliar #backendPHP #PHP8_3 #curlExec #JSONparsing #binaryResponses #base64decoding #polimorfismoHTTP #HTTPpolymorphism #limitacionesCreativas #creativeConstraints #Hostinger #sharedHosting #systemaNerviosoDigital #digitalNervousSystem #messageRouting #requestForwarding #APIabstraction #172L\u00edneasDeProxy #frontendBackendBridge #traducci\u00f3nDeAPIs #eficienciaPorL\u00ednea #eficienciaDeC\u00f3digo<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Toda herramienta de IA en Free Animation Power necesita comunicarse con APIs externas: OpenAI, Gemini, DeepSeek, Mistral, Groq, Pollinations. Cada una con su propio esquema [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-17","post","type-post","status-publish","format-standard","hentry","category-fap-web-hub"],"_links":{"self":[{"href":"https:\/\/freeanimationpower.org\/blog\/wp-json\/wp\/v2\/posts\/17","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/freeanimationpower.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/freeanimationpower.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/freeanimationpower.org\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/freeanimationpower.org\/blog\/wp-json\/wp\/v2\/comments?post=17"}],"version-history":[{"count":4,"href":"https:\/\/freeanimationpower.org\/blog\/wp-json\/wp\/v2\/posts\/17\/revisions"}],"predecessor-version":[{"id":331,"href":"https:\/\/freeanimationpower.org\/blog\/wp-json\/wp\/v2\/posts\/17\/revisions\/331"}],"wp:attachment":[{"href":"https:\/\/freeanimationpower.org\/blog\/wp-json\/wp\/v2\/media?parent=17"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/freeanimationpower.org\/blog\/wp-json\/wp\/v2\/categories?post=17"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/freeanimationpower.org\/blog\/wp-json\/wp\/v2\/tags?post=17"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}