
Curl es el caballo de batalla de Internet moderno. Como dice su eslogan, Curl es un programa utilitario utilizado para “transferir datos con URL”. Según el sitio web de Curl, la biblioteca es utilizada diariamente por miles de millones de personas en cualquier cosa, desde automóviles y televisores hasta teléfonos móviles. Es la columna vertebral de la red de miles de aplicaciones y servicios, incluidos algunos lugares muy interesantes, como los proyectos de la NASA. Muchos proyectos y bibliotecas de PHP que tienen que enviar o recibir datos a través de la red usan Curl como una biblioteca de red predeterminada bajo el capó. No es sorprendente que también sea una utilidad principal utilizada por las solicitudes de WordPress, así como la mayoría de nuestros WP Pro Plugins DB Pro, WP Descargar Media y WP Descargar SES.
Si tiene curiosidad sobre el poder de la Biblioteca Curl, cómo funciona WordPress y a qué prestar atención (especialmente macOS), entonces está en el lugar correcto. ¿Qué es Curl? Comencemos por repasar lo que es curl. Curl es de hecho dos piezas, Libcurr, que es la biblioteca C que hace que toda la magia y el programa Curl CLI. Los lenguajes de programación como PHP incluyen la biblioteca Libcurr como módulo, lo que les permite proporcionar la funcionalidad de curl de forma nativa. La biblioteca Libcurrl es una biblioteca de transferencia de URL y acepta una amplia variedad de protocolos. No solo http, sino también https, scp, sftp, http/2, http/3 e incluso gopher. Casi todos los protocolo que puedas imaginar el curlón de soporte.
¡Curl ha existido desde 1998 y cumple 23 años en 2021, cerca de un cuarto de siglo!Pero sigue siendo bastante fuerte y moderno y está en un desarrollo muy activo, sin signos de desaceleración.Aunque tiene su rareza y problemas, es útil para que un desarrollador sepa cómo trabaja y qué hace.Te escucho decir: “Ok Pete, genial.Te gusta esto con Curl, ¿por qué debería aprender sobre eso? ”.¡Hay algunas grandes razones!La primera razón es que el curl es cuidada y quiero decir muy cuidadoso.Es una forma como un cuchillo suizo en Internet.Esencialmente, si tiene un software que tiene que hacer una solicitud de red, si se trata de una solicitud de publicación HTTP para una URL remota o una descarga de archivo SFTP a menudo es la opción más simple.
Por ejemplo, para enviar una solicitud de solicitud HTTP con la carga de un archivo, usando CLI Curl, ejecutar: Curl –Form Name = Peter –Form Age = 34 -Form [Correo electrónico protegido] /usuarios/pettasker/fotos/ Image-1.jpg http://httpbin.org/post ¿Qué hay de descargar un archivo grande? Curl -o http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz o, ¿obtiene encabezados HTTP de un servidor? Curl -i https://deliciousbrains.com que devolverá los cabezales http: servidor: ningin datos: jueves, 11 de marzo de 2021 14:56:01 GMT Content -Type: Text/Html; Charset = UTF-8 Vary: Acept-Ecoding Link: ; Rel = “https://api.w.org/” enlace: ; rel = “alternativo”; Type = “Application/JSON” Enlace: ; Rel = ShortLink X-Frame-Opciones: Sameorigin X-Contemplate-type-opts: nosniff x-xss-protection: 1; Mode = bloque de contenido-seguridad-polycy: default-slf ‘self’ https: fecha: wss: ‘insegurar en línea’ ‘insegurar -val’; Referente-polycy: origen-when-cross-oirin, estricto-oirogin-when-cross-hyrigi-cache: la segunda razón por la que vale la pena aprender el rizo es que está disponible en casi cualquier plataforma y se puede instalar de manera rápida y fácil. Si tiene un servidor web, tiene la oportunidad de tener curl.
Por ejemplo, si aún no tiene Curl instalado en macOS, puede obtenerlo rápidamente con HomeBrew Running: Brew Install Curl Hasta ahora, hemos visto curl, instrumento CLI, pero los enlaces de curl también están disponibles para la mayoría de los idiomas, incluido PHP . Si usa el software PHP que realiza solicitudes de red, ¡probablemente use Curl! Curl y Php En el campo PHP, el soporte de curl es como cualquier otro módulo en el que pueda confiar, como MySQLI o GD Biblioteca. La mayoría de las versiones de PHP se compilan con el curl de forma predeterminada, pero la integración de curl es técnicamente una extensión, al igual que MySQLI y cualquier otra cosa enumerada en la sección de extensión del PHPINFO (sin embargo, la implementación de CURL de PHP deja de desear. Si bien el instrumento CURL CLI es relativamente simple, la implementación de PHP es un poco más complicada. Cuando trabaja con la implementación de curl por el PHP, se le pide que use la función curl_sept (). Esta característica le permite establecer las opciones de curl. Por ejemplo, la configuración de una publicación de solicitud http muestra lo siguiente: $ curl = curl_init (‘https://httpbin.org/post’); Curl_setpt ($ curl, curlopte_post, true); Curl_setep ($ curl, curlopte_postfields, array (‘field1’ => alguna fecha ‘,’ campo2 ‘=> algunas más fecha’)); Curl_setpt ($ curl, curlopt_returntransfer, true); $ Respuesta = curl_exec ($ curl); curl_close ($ curl); Aunque no es terrible, las solicitudes de esta manera pueden salir de control con mayores demandas y parámetros más complicados de curlapte_.

Afortunadamente, la maravillosa comunidad PHP ha creado bibliotecas que abstractan gran parte de la complejidad. Dos de las bibliotecas de redes más populares son Guzzle y solicitudes. Debido a que las solicitudes acepta versiones anteriores de PHP y WordPress, que ha admitido históricamente, versiones PHP (😩) muy antiguas, la biblioteca de solicitudes se usa en el núcleo de WordPress. Curl en WordPress internamente, WordPress usa la clase WP_HTTP para solicitudes de red, que, a su vez, se basa en la biblioteca de aplicaciones. Esto significa que todos los métodos de utilidad HTTP, como wp_remote_get () y wp_remote_post () usan solicitudes. En un alto nivel, las actualizaciones de WordPress, las descargas de complementos, las actualizaciones de complementos y casi cualquier funcionalidad de carga/descarga de WordPress usan abstracción de enlaces y opciones de curl. Echemos un vistazo rápido a cómo las solicitudes de solicitudes HTTP. Si abre WP-Includes/Class-Http.php, podrá verificar muchas instalaciones internas que ejecutan solicitudes HTTP en WordPress. Comenzando con WordPress 4.6, wp_http :: request (); El método utiliza el método de solicitudes :: request (). En WordPress 5.7, puede encontrar esta llamada en la línea 394 de la clase WP_HTTP mencionada anteriormente. $ Requests_response = requests :: request ($ url, $ encabezados, $ data, $ type, $ opciones); Bastante simple, ¿verdad? Ahora compara la solicitud de publicación HTTP a continuación con los Bruta Curlapts anteriores:
$ Data = array (‘key1’ => ‘value1’, ‘key2’ => value2 ‘); $ respuesta = requests :: post (‘http://httpbin.org/post’, array (), $ date); Mucho más simple. Y si trabaja en el contexto de un complemento o un tema de WordPress, puede usar la función wp_remote_post () para aún más abstracto: $ data = array (‘key1’ => value1 ‘,’ key2 ‘=> value2’); $ respuesta = wp_remote_post (‘http://httpbin.org/post’, array (‘data’ => $ date)); ¡Ahora hablamos! wp_remote_post () simplemente llama a wp_http :: request () con una publicación como parámetro del método. Ahora, como las solicitudes funciona internamente, para echar un vistazo a las includes WP/clases-requisitos. Php alrededor de la línea 359. en la línea 359. En la línea 359. En la línea 359. En la línea 359. En la línea 359. En la línea 359. En la línea 359. Solicitudes :: Método request (), puede ver que el código está buscando una opción de transporte $ primero. En la implementación de WordPress de las solicitudes, solo hay 2 opciones predeterminadas, curl y fsockopen, en este orden. FSockOpen usa flujos PHP y es una reserva para cuando no se instala la extensión de curl. … if (! vacía ($ opciones [‘transporte’)) {$ transport = $ options [‘transporte’]; if (is_string ($ options [‘transport’)) {$ transport = new $ transport (); }} else {$ Need_ssl = (0 === Stripos ($ url, ‘https: //’)); $ capacities = array (‘ssl’ => $ Need_ssl); $ transport = self :: get_transport ($ capacidades); } $ respuesta = $ transport-> solicitud ($ url, $ cabezal, $ fecha, $ opciones); … Una vez que se determina el transporte, la solicitud se pasa en la clase de transporte elegida. Debido a que cubrimos Curl en este artículo, examinaremos rápidamente cómo las solicitudes usan curl.
A continuación, en WP-Includes/solicitudes/transporte/curl.php, alrededor de la línea 130, veremos cómo funcionan realmente las solicitudes. Esta clase resalta cuán compleja puede ser trabajar con Curl en PHP. La mayor parte de la lógica de la clase se refiere a la verificación y gestión de los encabezados de solicitud y respuesta y la configuración correcta de curlafos en función de los parámetros más allá del método. Muchas configuraciones de parámetros también se administran en las requests_transport_curr :: setup_handler () en la línea 309, que cambia entre las opciones transmitidas y se establece correctamente curlop_: … switch ($ options [‘type’)) {solicitudes de casos :: post : curl_setpt ($ this-> handle, curlopt_post, true); Curl_setop ($ this-> handle, curlopt_postfields, $ date); descanso; Solicitudes de casos :: head: curl_setpt ($ this-> handle, curlopt_customRequest, $ options [‘type’); Curl_setop ($ this-> handle, curlopt_nobody, true); descanso; Solicitudes de casos :: Trace: curl_setpt ($ this-> handle, curlopt_customRequest, $ options [‘type’); descanso; Solicitudes de casos :: parche: solicitudes de casos :: PUT: solicitudes de casos :: Eliminar: solicitudes de casos :: Opciones: predeterminadas: curl_setpt ($ this-> handle, curlopt_customRequest, $ options [‘type’); if (! vacía ($ date)) {curl_setpt ($ this-> handle, curlopte_postfields, $ date);
}} … Finalmente, todo se reduce a una llamada curl_exec () una vez que todas las opciones se hayan establecido. Si parece complicado, ¡es porque lo es! Diferentes servidores y hosts tienen diferentes requisitos para los encabezados HTTP y la administración de SSL. Las solicitudes hacen un buen trabajo tratando de organizar una amplia variedad de configuraciones. Además, hay varios ganchos en las funciones de la red de WordPress que permiten reemplazar las opciones de curl si es necesario. Por ejemplo, tengo los siguientes comentarios en una mu-pluin en mi entorno de desarrollo local: add_action (‘http_pi_curr’, function ($ handle) {// no verifique ssl curts curl_setpt ($ handle, curlop_ssl_verifypeer, falso); ( $ Handle, curlopt_ssl_verifyhost, falso); // usa Charles http proxy En el ejemplo anterior, uso el gancho http_api_curl para desactivar primero el certificado SSL. Esto es útil cuando se trabaja con un sitio de desarrollo con un certificado auto -firmado que no debe validarse. En una nota secundaria, una excelente alternativa al sobrescribir las opciones de rizos para desactivar la verificación del host es crear su propia autoridad de certificación para el servidor local. El segundo bloque me permite hacer proxy a través de Charles para inspeccionar las solicitudes de la red PHP a medida que avanzo por el cable. Charles es una herramienta maravillosa para solucionar las solicitudes de red que le permite ver los detalles esenciales de cada solicitud en su entorno local.
¿Cómo actualizo Curl en WordPress? Bueno no. WordPress no tiene su propia biblioteca Curl, pero se basa en la versión curl ofrecida por la instalación de PHP. Y la extensión de PHP Curl es un recubrimiento alrededor de Libcurr y utilizará la versión de LibCurr que está instalada en el servidor. Por lo tanto, la actualización de CURL para WordPress casi siempre será la misma que la actualización de CURL en el servidor web. A menos que lo administre usted mismo, debe pedirle al administrador del servidor o a la empresa de alojamiento que lo ayude. Si administra su propio servidor Ubuntu, puede obtener la última versión de Libcurl con: Sudo Apt Update Sudo Apt Upgrade Si eso todavía lo deja con una versión de curls obsoletas, probablemente tenga que actualizar Ubuntu en sí. Está un poco fuera del propósito de esta publicación, pero es bueno reconocer las señales de que el rizo podría superarse. El signo más obvio de que la versión CURL en su servidor es demasiado antigua es que WordPress no puede conectarse a servidores remotos a través de HTTPS. El mensaje de error para buscar es el error de curl 60. Este error significa que Curl no puede verificar el certificado SSL del host remoto. Esto podría ser causado por una lista de certificados raíz obsoletos en su sistema para verificar la versión actual de Curl a través de WordPress Board, Herramientas de acceso → Salud del sitio → Información:

Compare su versión CURL con la lista de versiones de CURL. Si tiene más de 3 años, es una buena idea actualizar. Si es anterior a 2017, es posible que tenga problemas para conectarse a algunos servicios de Amazon desde el 23 de marzo de 2021. Curl en Mac Uno de los problemas que he visto aparece de vez en cuando en las aplicaciones para WP Migra DB Pro se refiere a cómo Curl y SSL trabajan juntos. OpenNSL es una herramienta estándar de SSL/TLS TLS en la industria para la gestión de comunicaciones cifradas. Al igual que Curl, es otra biblioteca de software. Curl se compila con un conjunto de herramientas SSL/TLS para hacer conexiones a través del protocolo TLS. En el caso de WP Migra DB Pro, esto sería cuando intente presionar o extraer de un sitio que tiene un certificado SSL (Sitios HTTPS). Puede ocurrir un problema en MacCos cuando Curl no se compila con OpenSL. La gestión de SSL con CURL es un tema enorme (hemos escrito documentación sobre este tema), pero en los medios MACCOS, el problema normalmente se usa una biblioteca SSL/TLS diferente llamada Securetransport. Esto causó problemas en las computadoras MAC, porque SecretRansport de Apple no ha implementado todas las funciones SSL/TLS tan rápido como OpenSL. Por ejemplo, Apple necesitaba hasta OSX/High Sierra (10.13.4) en 2018 para incluir soporte para el protocolo HTTP/2. Esto podría causar problemas para el desarrollo local en Mac. La situación es mucho mejor ahora, pero todavía hay algunos casos raros en los que el transporte local vs.
SSL puede morderte. Una buena prueba para ver qué versión OpenSSL usa PHP es usar el GREP para buscar la cadena “Versión SSL” en la salida PHPINFO. PHP -I | Como resultado, debe ver si está utilizando OpenSL o Securetransport. # Ubuntu 20.04: ssl versión => opensl/1.1.1i # macOS 11.2.1/big ssl versión => (secureTransport) OpenSl/1.1.1i Como puede ver, Php en un servidor de desarrollo de Ubuntu (que preferimos), Pero el intérprete PHP en mi Mac usa SecureTransport de Apple, con enlaces OpenSL (por lo que estará bien). ¡Pero espera! Hay algo más con Curl y MacCos. Mire de cerca lo que el instrumento CURL CLI informa en mi Mac: Curl 7.64.1 (x86_64-apple-darwin20.0) libcurl/7.64.1 (Securetransport) libressl/2.8.3 zlib/1.2.11 nghttp2/1.41.0 Fecha: 2019-03-27 Protocolos: archivo DICT ftp ftps gopher http https iMap iMaps LDAP LDAPS POP3 POP3S RTSP SMB SMB SMTP SMTPS TFTP TFTP: ASYNCHDNS GSS-SAPI HTTP2 HTTPS-PROXY IPV6 KERBEROS El instrumento CURL CLI también utiliza la biblioteca Apple Securetransport, pero esta vez está conectado a Libressl, que es otra biblioteca para la administración de SSL. Lo interesante a tener en cuenta aquí es que en una Mac, el curl en PHP y el curl en la línea de comandos puede usar diferentes bibliotecas para la administración de SSL. 🙃 Si quieres asegurarte de que tu línea


PHP y Curl: cómo WordPress hace solicitudes HTTP
Tags PHP y Curl: cómo WordPress hace solicitudes HTTP
homefinance blog