Foros del Web » Programando para Internet » PHP »

Utilizar la API de Mysqlnd desde php

Estas en el tema de Utilizar la API de Mysqlnd desde php en el foro de PHP en Foros del Web. Hola gente, estube investigando acerca del controlador nativo de mysql que traen las ultimas verciones de php (mysqlnd) y queria saber si hay alguna forma ...
  #1 (permalink)  
Antiguo 01/01/2014, 14:09
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 7 años, 5 meses
Puntos: 319
Utilizar la API de Mysqlnd desde php

Hola gente, estube investigando acerca del controlador nativo de mysql que traen las ultimas verciones de php (mysqlnd) y queria saber si hay alguna forma de usarlo desde php de forma directa (sin pasar por mysqli o PDO).

Si se escribe un controlador en C es posible acceder a sus metodos, pero desde php no encontre nada ¿Sera que no se puede o que no busque bien?

En el codigo fuente hay muchos registros de PHPAPI pero ninguno de PHP_FUNCTION, un ejemplo seria:

Código C++:
Ver original
  1. PHPAPI MYSQLND * mysqlnd_connect(MYSQLND * conn,
  2.                           const char * host, const char * user,
  3.                           const char * passwd, unsigned int passwd_len,
  4.                           const char * db, unsigned int db_len,
  5.                           unsigned int port,
  6.                           const char * socket_or_pipe,
  7.                           unsigned int mysql_flags
  8.                           TSRMLS_DC);

sin embargo no encuentro como llamar a esta funcion desde php, ¿hay alguna manera o la unica forma de acceder es creando una extencion de php en C?

esta es la configuracion actual que tengo instalada:
mysqlnd

mysqlnd enabled
Version mysqlnd 5.0.10 - 20111026 - $Id: b0b3b15c693b7f6aeb3aa66b646fee339f175e39 $
Compression supported
SSL supported
Command buffer size 4096
Read buffer size 32768
Read timeout 31536000
Collecting statistics Yes
Collecting memory statistics Yes
Tracing n/a
Loaded plugins mysqlnd,example,debug_trace,auth_plugin_mysql_nati ve_password,auth_plugin_mysql_clear_password
API Extensions mysql,mysqli,pdo_mysql
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios

Última edición por NSD; 01/01/2014 a las 14:45
  #2 (permalink)  
Antiguo 02/01/2014, 10:58
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 13 años, 4 meses
Puntos: 2135
Respuesta: Utilizar la API de Mysqlnd desde php

El problema es que no entiendes que es MySQLND.

PHP usa la librería de MySQL para poder enlazarse directamente a MySQL, esa librería (libmysql) es usada por las extensiones de PHP (mysqli, mysql, pdo_mysql), y dependen totalmente de ella, pero por cambios de licencia en MySQL, los desarrolladores de PHP optaron por escribir una librería de acceso ellos mismos basada en libmysql y agregandole características extra.

Esta nueva librería (mysqlnd) esta en C, al igual que libmysql, solo que no depende en nada de MySQL, es una implementación propia y total de PHP.

La librería lo que hace es enlazar una comunicación común entre el cliente y el servidor, usando TCP/IP, y un API estandarizado de seguridad, compresión, pool de conexiones etc. Si te pones a estudiar un poco de como funciona MySQL, pudieras tú mismo desde PHP conectarte usando las operaciones de Sockets de PHP, pero tendrías que implementar todo, desde como comprime los datos, como los cifra, cache de datos etc, es mucho trabajo para algo que ya esta hecho.

Ahora estas librerías lo que hacen es exponer un API común, y este API es consumido totalmente por las extensiones de PHP en C, las extensiones a su vez (en C) exponen el API directamente a PHP, para ser consumido por tus scripts PHP.

Cuando compilas las extensiones (o al compilar PHP) le debes de indicar al compilador que librería va a usar, si libmysql (shared) o mysqlnd (built-in), esto es porque no es algo que se pueda exponer en tiempo de ejecución, las librerías están enlazadas en el código fuente.

Si entiendes esto, vas a ver que no puedes accesar a estas librerías, desde PHP, sin hacer una extensión en el lenguaje base (esto es en C).

Si lo que quieres es hacer esto hay mucha documentación del ZendEngine, pero no vas a obtener ninguna ganancia al hacerlo vía las extensiones que PHP ya te da (mysql, mysqli, pdo_mysql).

Saludos.
  #3 (permalink)  
Antiguo 04/01/2014, 09:10
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 7 años, 5 meses
Puntos: 319
Respuesta: Utilizar la API de Mysqlnd desde php

Bien, hasta ahi me quedo claro, pero no es posible acceder a esta api por ningun medio desde php? por ejemplo, heredando de mysql/mysqli/PDO? estas clases tendran algun metodo protected que permita el acceso a la api o no?
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #4 (permalink)  
Antiguo 04/01/2014, 09:26
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.318
Antigüedad: 11 años, 10 meses
Puntos: 2653
Respuesta: Utilizar la API de Mysqlnd desde php

Lee con más atención:
Cita:
Cuando compilas las extensiones (o al compilar PHP) le debes de indicar al compilador que librería va a usar, si libmysql (shared) o mysqlnd (built-in), esto es porque no es algo que se pueda exponer en tiempo de ejecución, las librerías están enlazadas en el código fuente.
Es decir, no puedes bajo ninguna circunstancia porque esas librerías no son como las DLL del .Net. Están incrustadas en el mismo fuente de PHP, y si no están alli, no las puedes usar.

Cita:
estas clases tendran algun metodo protected que permita el acceso a la api o no?
Si... programando en C++. Al igual que cuando editas el código fuente de PHP, cosa que si quieres tomarte el trabajo de hacer, siempre puedes.

No sigas perdiendo tiempo. Lo que pides hacer no es posible en el contexto de uso que les quieres dar.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 04/01/2014, 12:59
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 7 años, 5 meses
Puntos: 319
Respuesta: Utilizar la API de Mysqlnd desde php

Cita:
Es decir, no puedes bajo ninguna circunstancia porque esas librerías no son como las DLL del .Net. Están incrustadas en el mismo fuente de PHP, y si no están alli, no las puedes usar.
a ver, eso lo entiendo, si la vercion de php que estoy usando no se compilo con mysqlnb no la podre usar.

si la vercion se compilo con mysqlnb entonces las clases mysql/msqli/pdo son los que la usan y solo puedo interactuar con ellos (a menos que escriba mi propia extencion o edite php en C++ cosa que de momento no voy a hacer)

por ende solo puedo interactuar con estas clases que ya se abstraen del controlador nativo que se use, no hay forma de acceder desde php al controlador sea mysqlnb/libmysql/otro de forma directa, solo puedo usar las abstracciones que proveean estas clases.

pues bien, si creo una extencion de pongamos mysqli:

Código PHP:
Ver original
  1. <?php
  2.     class my_mysqli extends mysqli
  3.     {
  4.         public function __construct($host, $usuario, $contrasena, $bd)
  5.         {
  6.             parent::__construct($host, $usuario, $contrasena, $bd);
  7.  
  8.             die('Esta clase cuando se intenta conectar explota.');
  9.         }
  10.     }

a que metodos/propiedades protected tengo acceso ahora? que cosas nuevas puedo hacer con esta clase desde dentro que no podia desde afuera? hay algo nuevo a lo que tengo accesso o no hay nada y a esto te refieres cuando dices
Cita:
Si... programando en C++.
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #6 (permalink)  
Antiguo 04/01/2014, 13:10
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.318
Antigüedad: 11 años, 10 meses
Puntos: 2653
Respuesta: Utilizar la API de Mysqlnd desde php

Bueno, a mi entender, lo que tienes allí es un problema de comprensión de POO.
Si extiendes una clase, si mal no recuerdo, lo que haces es crear una clase que hereda a otra, tal que le puedes agregar a la clase nueva algunos comportamientos nuevos que sólo afectarán a esa clase.
Pero por definición no puedes agregarle nada a la clase padre, sólo a la hija. Y en ese sentido, de la clase padre, la hija sólo hereda aquellas propiedades y métodos públicos, así como los protegidos, pero no los privados. Y de los accesibles sólo puedes sobrecargarlos pero no modificar los de la clase padre.
Además, como esa clase padre ya tiene incrustada la librería indicada, como mucho podrás usar los mismos recursos de ella que ya están disponibles en el padre, pero no agregar ninguna nueva.
Una clase, en un lenguaje como PHP, se extiende sólo para encapsular en nuevas clases comportamientos que se necesitan para un sistema determinado, de modo que no necesites reescribir esos metodos en otras creaciones de instancias de objetos del mismo sistema.

Para hacer lo que quieres, sigues teniendo que olvidarte de PHP y pasar a editar el kernel de PDO en C o lo que fuese que usa. No tienes otras opciones.

Entiende esto: desde el momento en que tomas una extensión precompilada, sólo puedes usar lo que ella te provee, y no puedes meterte en su codigo interno para modificarlo.

¿Se va entendiendo?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 04/01/2014, 16:08
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 926
Antigüedad: 12 años, 6 meses
Puntos: 269
Respuesta: Utilizar la API de Mysqlnd desde php

Cita:
Iniciado por NSD Ver Mensaje
por ende solo puedo interactuar con estas clases que ya se abstraen del controlador nativo que se use, no hay forma de acceder desde php al controlador sea mysqlnb/libmysql/otro de forma directa, solo puedo usar las abstracciones que proveean estas clases.
Nunca vas a poder llamar a esas clases directamente.Lo maximo que vas a poder hacer, es programar en C una extension que haga de interfaz entre PHP y esas clases.Esto es lo que llamas "abstraccion", pero que tambien podria llamarse wrapper, que tiene una connotacion distinta.La diferencia entre una "abstraccion" y un wrapper puede llegar a ser bastante subjetiva.
Asi que, resumiendo, nunca vas a poder llamar a esas clases directamente.Son clases C.No PHP.Necesitas un wrapper (extension).Ya existe, se llama mysqli.
  #8 (permalink)  
Antiguo 05/01/2014, 13:13
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 7 años, 5 meses
Puntos: 319
Respuesta: Utilizar la API de Mysqlnd desde php

Si si, lo explicaron muy bien y lo entendi, me queda claro que no puedo acceder al controlador salvo a travez de un wrapper (no conocia ese termino) y al ser ese wrapper mysqli entonces debo usar ese (o armar uno propio en C).

Hasta ahi estamos todos deacuerdo, como dise gnzoloyo, al extender una clase heredo metodos publicos y protegidos, no puedo modificarlos pero puedo usarlos, ejemplo tonto:

Código PHP:
Ver original
  1. <?php
  2.     class mysqli
  3.     {
  4.         private function conectar_controlador_nativo_mysqlnb($param1, $param2)
  5.         {
  6.             //...
  7.             return $conexion;
  8.         }
  9.         private function conectar_controlador_nativo_libmysql($param1, $param2)
  10.         {
  11.             //...
  12.             return $conexion;
  13.         }
  14.        
  15.     protected function controlador_connect($param1, $param2)
  16.         {
  17.             if($condicion)
  18.             {
  19.                 $this->conectar_controlador_nativo_mysqlnb($param1, $param2);
  20.             } else {
  21.                 $this->conectar_controlador_nativo_libmysql($param1, $param2);
  22.             }  
  23.             return $conexion;
  24.         }
  25.        
  26.         public function connect($param1, $param2)
  27.         {
  28.             //...
  29.             $this->function controlador_connect($param1, $param2);
  30.             //...
  31.         }      
  32.     }
  33.    
  34.     class my_mysqli extends mysqli
  35.     {
  36.         public function mi_conexion($param1, $param2)
  37.         {          
  38.         // Aca podria usar esto sin problemas.
  39.         $this->controlador_connect($param1, $param2);
  40.            
  41.         }
  42.        
  43.     }

Lo que no se, (y tampoco encontre en san gugul) es si mysqli tiene metodos/propiedades protegidas y cuales son estas, el objetivo de extenderla es usar esto, pero si no existen no tiene sentido
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #9 (permalink)  
Antiguo 05/01/2014, 13:41
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 11 años, 9 meses
Puntos: 845
Respuesta: Utilizar la API de Mysqlnd desde php

Esa información debería estar en la documentación, en esta debería indicar los métodos y propiedades que tienes disponibles, si no es así(como es el caso de algunas clases en el SPL) siempre puedes hacer una introspección utilizando Reflection ;)

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #10 (permalink)  
Antiguo 05/01/2014, 13:53
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 7 años, 5 meses
Puntos: 319
Respuesta: Utilizar la API de Mysqlnd desde php

En el manual se habla extensa y arduamente de los metodos y propiedades publicas pero no menciona los protegidos (no niega su existencia pero tampoco menciona a ninguno)

Cita:
siempre puedes hacer una introspección utilizando Reflection
apa, esto no lo conocia, voy a investigar sobre esta clase
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios

Etiquetas: api, mysql, registro, sql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 00:22.