martes, 10 de marzo de 2020

Cómo instalar OCI8 en Ubuntu 18.04 y PHP 7.2

No hay comentarios.:

Fuente: https://gist.github.com/Yukibashiri/cebaeaccbe531665a5704b1b34a3498e



Instale Oracle Instant Client y SDK


Paso 1

Descargue Oracle Instant Client y SDK del sitio web de Oracle. (Necesita iniciar sesión en la página de Oracle)

http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html

Descargar

  • Instant Client Package - Basic
  • Instant Client Package - SDK
  • Instant Client Package - Sql Plus (Opcional)
  • Paso 2

    Cree una nueva carpeta para almacenar archivos zip de Oracle Instant Client en su servidor.

        sudo mkdir /usr/lib/oracle
        sudo mkdir /usr/lib/oracle/12.2
        sudo mkdir /usr/lib/oracle/12.2/client64
    

    Paso 3

    Ahora necesitamos extraer los archivos.

        sudo cp instantclient-basic-linux.x64-12.2.0.1.0.zip /usr/lib/oracle/12.2/client64
        sudo cp instantclient-sdk-linux.x64-12.2.0.1.0.zip /usr/lib/oracle/12.2/client64
        sudo cp instantclient-sqlplus-linux.x64-12.2.0.1.0.zip /usr/lib/oracle/12.2/client64
    
        cd /usr/lib/oracle/12.2/client64
    
        sudo unzip instantclient-basic-linux.x64-12.2.0.1.0.zip
        sudo unzip instantclient-sdk-linux.x64-12.2.0.1.0.zip
        sudo unzip instantclient-sqlplus-linux.x64-12.2.0.1.0.zip
    
        sudo mv instantclient_12_2 lib
        
    

    Paso 4

    A continuación, necesitamos crear un enlace simbólico a los archivos de Instant Client.

        cd /usr/lib/oracle/12.2/client64/lib/
        sudo ln -s libclntsh.so.12.1 libclntsh.so
        sudo ln -s libocci.so.12.1 libocci.so
    

    Otra opcion para este mismo paso

        ln -s /usr/lib/oracle/12.2/client64/lib/libclntsh.so.12.1 /usr/lib/oracle/12.2/client64/lib/libclntsh.so
        ln -s /usr/lib/oracle/12.2/client64/lib/libocci.so.12.1 /usr/lib/oracle/12.2/client64/lib/libocci.so
    

    Paso 5

    Agregue la carpeta a nuestro ldconfig.
        sudo su -
        echo /usr/lib/oracle/12.2/client64/lib > /etc/ld.so.conf.d/oracle.conf
    

    Paso 6

    Actualice los enlaces de tiempo de ejecución de Dynamic Linker

        ldconfig
    

    Hecho. Ahora podemos pasar a la siguiente parte.


    Instalar paquetes adicionales


    Para instalar la extensión OCI8, necesitamos instalar algún paquete adicional en nuestro servidor.

    Paso 1

    Ejecute estos comandos:

        sudo apt-get install php-dev php-pear build-essential libaio1
    

    Paso 2

    Una vez instalado, necesitamos obtener el archivo OCI8. Pero, antes de eso, necesitamos actualizar el canal PECL.

        sudo pecl channel-update pecl.php.net
    

    Luego instalaremos oci8

        sudo pecl install oci8
    

    Cuando se le solicite la ubicación del Instant Client, ingrese lo siguiente:

        instantclient,/usr/lib/oracle/12.2/client64/lib
    

    Al finalizar deberia mostrar:

        Build process completed successfully
        Installing '/usr/lib/php/20170718/oci8.so'
        install ok: channel://pecl.php.net/oci8-2.2.0
        configuration option "php_ini" is not set to php.ini location
        You should add "extension=oci8.so" to php.ini
    

    Paso 3

    Necesitamos decirle a PHP que cargue la extensión OCI8.

        sudo su -
        sudo echo "extension=oci8.so" >> /etc/php/7.2/fpm/php.ini
        echo "extension=oci8.so" >> /etc/php/7.2/cli/php.ini
    

    Paso 4

    Actualiza el servidor.

        sudo shutdown -r now
    
        sudo service php7.2-fpm restart
    

    Hasta aqui funciona el cli pero no fpm


    Configurar fpm


    Paso 1

    cd /etc/php/7.2/mods-available/
    sudo touch oci.ini
    sudo vi oci.ini
    
    agregaar a oci.ini
        extension = oci8.so
    

    Paso 2

    Ahora cree un enlace simbólico como este:

        cd /etc/php/7.2/fpm/conf.d
        sudo ln -s /etc/php/7.2/mods-available/oci.ini 20-oci.ini
    

    Paso 3

    Actualiza el servidor.

        sudo shutdown -r now
    
        sudo service php7.2-fpm restart
    

    Paso 4

    Ahora crea un archivo php info

        
        cd /var/www/html/
        sudo touch info.php
        sudo vi info.php
    

    agregar a info.php

        <?php
            phpinfo();
    

    Deberia mostrar la seccion oci

        oci8
        OCI8 Support enabled
        OCI8 DTrace Support disabled
        OCI8 Version 2.2.0
        Oracle Run-time Client Library Version 12.2.0.1.0
        Oracle Compile-time Instant Client Version 12.2
    

    Configurar Sqlplus (opcional)


    Paso 1

    Agregando rutas al .bashrc

        cd $h
        vi .bashrc
    

    Agregar

    export ORACLE_HOME=/usr/lib/oracle/12.1/client64
    export TNS_ADMIN=/usr/lib/oracle/12.1/client64/network/admin
    export PATH=$PATH:$ORACLE_HOME/lib
    export LD_LIBRARY_PATH=$ORACLE_HOME/lib
    export EDITOR=vi
    

    Paso 2

    Crear el archivo tnsnames.ora

        cd /usr/lib/oracle/12.2/client64
        sudo mkdir /usr/lib/oracle/12.2/client64/network
        sudo mkdir /usr/lib/oracle/12.2/client64/network/admin
        cd /usr/lib/oracle/12.2/client64/network/admin
        sudo touch tnsnames.ora
        sudo vi tnsnames.ora
    

    Agregar

    orcl =
      (DESCRIPTION =
        (ADDRESS_LIST =
          (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.1)(PORT = 1521))
         )
        (CONNECT_DATA =
          (SERVICE_NAME = orcl)
        )
      )
    

    Por ultimo vamos a probar

        sqlplus system/system@orcl
    
    Ver

    lunes, 19 de noviembre de 2018

    Crear una api rest con Lumen 5.7

    No hay comentarios.:

    Que es lumen

    Lumen es un micro framework basado en laravel, al utilizar solo los componentes centrales de Laravel lo hace mas rápido y eficiente.


    Requisitos

    Para utilizar laravel o lumen es necesario tener instalado php de preferencia 7.1.3 en adelante.

    Lumen utiliza Composer para gestionar sus dependencias. Entonces, antes de usar Lumen, asegúrese de tener Composer instalado en su máquina.

    Se creara una tabla en la base de datos mysql o MariaDB por lo que se debe tener instalado una de las 2.
    • PHP
      • https://windows.php.net/download#php-7.2
      • Recuerde instalar VC15 x64 Non Thread Safe
    • Composer
      • https://getcomposer.org/download/
    • Mysql o Maria db
      • https://dev.mysql.com/downloads/mysql/
      • https://downloads.mariadb.org/

    Objetivo

    Crear una api para acceder a la tabla Categorias.



    Crear proyecto


    Primero descargue el instalador de lumen (solo se hace una vez)

    composer global require "laravel/lumen-installer"


    Ahora vamos a crear el proyecto bajo el nombre ejemplo (esto puede tardar)

    lumen new ejemplo




    Comprobaremos el proyecto creado, ingresando a la carpeta y ejecutando el servidor integrado de de php.

    cd ejemplo


    <?php
    php -S localhost:8000 -t public
    
    


    Luego navegamos a la url generada.




    La documentación hasta este punto la pueden encontrar en esta url.

    https://lumen.laravel.com/docs/5.7


    Configuraciones de base de datos


    Configurar acceso a bases de datos.

    El archivo donde lumen administra sus configuraciones por medio del archivo .env el cual se copia del archivo .env.example

    renombrado archivo

    Linux

    • cd ejemplo
    • mv .env.example .env
    Windows (power shell)
    • cd ejemplo
    • Rename-Item -Path env.example -NewName .env
    Abrimos el archivo .env y ingresamos las credenciales de la base de datos.

    DB_CONNECTION=mysql
    DB_HOST=127.0.0.1
    DB_PORT=3306
    DB_DATABASE=ejemplo
    DB_USERNAME=homestead
    DB_PASSWORD=secret
    
    
    En la capacitación nos conectaremos con usuario root luego lo cambiaremos en ambientes de producción.



    No olvide crear la base datos:

    create database ejemplo;


    Migraciones
    Vamos a crear la tabla categorias por medio de migraciones.

    php artisan make:migration create_categories_table

    Created Migration: 2018_11_20_041401_create_categories_table

    Las migraciones se ingresan dentro de la carpeta Database/migration aquí encontrará  el archivo creado.




    Ahora vamos a crear los campos de la tabla categorías.
     
        public function up()
        {
            Schema::create('categories', function (Blueprint $table) {
                $table->increments('CategoryID');
                $table->string('CategoryName');
                $table->mediumText('Description');
                $table->binary('Picture')->nullable();
                $table->timestamps();
            });
        }
    
    
    Ya que tenemos lista la migración lo enviaremos a la base de datos.

    php artisan migrate

    Migration table created successfully.
    Migrating: 2018_11_20_041401_create_categories_table
    Migrated:  2018_11_20_041401_create_categories_table





    Nota.
    Si te equivocaste o puede des hacer la creación de la tabla con:
    php artisan migrate:rollback

    Documentación hasta este punto:
    https://laravel.com/docs/5.7/migrations

    Modelo

    Cada tabla de base de datos tiene un "Modelo" correspondiente que se utiliza para interactuar con esa tabla. Los modelos le permiten consultar datos en sus tablas, así como insertar nuevos registros en la tabla.

    Lumen no carga inicialmente Eloquent.

    Para poder usarlos, debemos des comentar las siguientes líneas de código ubicadas en
    bootstrap/app.php
    $app->withFacades();
    $app->withEloquent();
    


    Cree un archivo con el nombre Categories.php bajo la carpeta App



    use Illuminate\Database\Eloquent\Model;

    class Categories extends Model
    {

     protected $table = 'Categories';
     protected $primaryKey = 'CategoryID';
     protected $fillable = ['CategoryID','CategoryName','Description'];
     protected $hidden = ['created_at','updated_at','Picture'];

    }

    Documentación:
    Filltable = Propiedades disponibles
    hidden= Propiedades que vamos a ocultar
    https://laravel.com/docs/5.7/eloquent

    Controladores

    En lugar de definir toda la lógica de manejo de su solicitud como cierres en archivos de ruta, es posible que desee organizar este comportamiento usando clases de controlador. Los controladores pueden agrupar la lógica de manejo de solicitudes relacionadas en una sola clase. Los controladores se almacenan en el directorio.app/Http/Controllers

    Crear un archivo llamado CategoriesController.php en la carpeta "app/Http/Controllers"
    <?php namespace App\Http\Controllers;
    
    use App\Categories;
    use Illuminate\Http\Request;
    
    class CategoriesController extends Controller
    {
        public function index()
        {
            $categories = Categories::all();
            return response()->json($categories, 200);
        }
    
    
        public function getCategories($id)
        {
            $categoria = Categories::find($id);
            if($categoria)
            {
                return response()->json($categoria, 200);
            }
    
            return response()->json(["Categoria no encontrado"], 404);
    
        }
    
        public function createCategories(Request $request)
        {
            $categoria = new Categories;  
            $categoria->CategoryName = $request->CategoryName;
            $categoria->Description = $request->Description;
            $categoria->save();
            return response()->json($categoria);  
        }
    
        public function updateCategories(Request $request,$id)
         { 
    
            $categoria= Categories::find($id);
                
            $categoria->CategoryName = $request->CategoryName;
            $categoria->Description = $request->Description;
            $categoria->save();
            return response()->json($categoria);
         }
    
         public function destroyCategories($id)
         {
            $categoria = Categories::find($id);
            $categoria->delete();
             return response()->json('La categoria fue eliminada');
         }
    }
    
    



    Documentación:
    https://laravel.com/docs/5.7/controllers

    Router

    Todas las rutas de Laravel se definen en sus archivos de ruta, que se encuentran en el  routesdirectorio. Estos archivos se cargan automáticamente por el marco. El archivo define rutas que son para su interfaz web.

    Abra el archivo web.php en la carpeta routes
    $router->get('/categories', 'CategoriesController@index');
    $router->get('/categories/{id}', 'CategoriesController@getCategories');
    $router->post('/categories', 'CategoriesController@createCategories');
    $router->put('/categories/{id}', 'CategoriesController@updateCategories');
    $router->delete('/categories/{id}', 'CategoriesController@destroyCategories');
    
    

    Documentación
    https://laravel.com/docs/5.7/routing

    Probando

    Es hora de probar nuestra api, lo ideal es usar una instalar una aplicación llamada POSTMAN.

    https://www.getpostman.com/download?platform=win64


    Ingresando Categorías



    Listando las Categorías



    Actualizar Categorías


    Eliminar Categorías


    Ver

    domingo, 5 de febrero de 2017

    HTTP/2

    No hay comentarios.:
    HTTP2 o H2 para los amigos nació en el 2012 pero los navegadores comenzaron a utilizarlo hasta el 2015, es nuestra responsabilidad en como desarrolladores de migrarnos a este nuevo protocolo, al realizar esta sencilla migración no solo vamos hacer nuestros sitios sean mas seguros si no que también vamos a mejorar el rendimiento.

    Historia:


    Después de 15 años de vivir con HTTP /1.1 empieza a ser insuficiente para los tiempos que corren, cada vez las mejores conexiones a internet sin embargo no podemos sacarle el provecho a dichas conexiones ya que HTTP /1.1 sufre mucho cuando se realizan demasiadas peticiones degradando el rendimiento, solo pudiendo trasmitir 6 paquetes a la vez, permíteme explicarlo con un ejemplo.

    Tu página web tiene 2 CSS, 2 JS y 8 imágenes, con el protocolo HTTP / 1.1 tendría que hacer 2 viajes para cargar esa página web, durante esto años los desarrolladores han utilizado muchos trucos evitar los restricciones de HTTP / 1.1 

    En esta caso en particular el desarrollador puede unificar los 2 CSS  en un solo archivo o colocar cada CSS en servidores de distribución de contenido (CDN)  los cuales son servidores especializados en compartir tus documento

    Con las imágenes podemos utilizar image sprite, que por si no lo sabes es un archivo de imagen que contiene todas las imágenes que va utilizar tu sitio y se hace referencia a estas pequeñas image a través de coordenadas, con esto disminuimos de 8 llamadas a 1 sola. 







    Por qué Cambiarse a HTTP / 2 ?

    El principal cambio seria que con una  sola conexión podrás hacer multiple solicitudes y respuesta en paralelo, así que ya tendrás la restricción de solo 6 llamadas, por lo que tu sitio puede llegar hacer hasta un 60% más rápido.


    Migrando HTTP /2


    Que tengo que hacer para migrar?

    Lo primero es tienes que hacer que tu sitio sea HTTPS ya que aun HTTP /2 no necesita el uso cifrado la gente de los navegadores (Chrome, Firefox, Microsoft Edge) han decidido que solo le darán soporte sobre TLS, por lo que tendrás que adquirir un certificado digital y si no tienes para comprar el certificado puedes utilizar uno gratuito por medio de Lets Encrypt.



    Ahora que tienes tu sitio sobre HTTPS, tienes que hacer unos pequeños cambios en tu servidor.

    Linux


    NGINX
    En nginx solo tiene que agregar http2  en la línea listen de tu archivo de configuración.


    Aquí dejo dejo el link para una guía completa de la gente digital Ocean.

    Deben asegurarse

    Apache
    Con apache debes de agregar unos módulos.



    Dejo la guía completa.
    https://www.rosehosting.com/blog/how-to-set-up-apache-with-http2-support-on-ubuntu-16-04/


    ALPN
    Para que HTTP 2 les funcione en Google Chrome deben de tener soporte a ALPN, no todos las distribuciones de linux, Solo Ubuntu 16.04 tiene soporte para ALPN, pero hay formas de agregarlo a Centos.


    Si el sistema operativo no soporta ALPN google Chome no utilizara http 2 si no bajara a http 1.1


    Windows


    Internet Information Server (IIS)

    Con IIS la gente de Microst si la hacer complicada ya que requiere de cambiar tu servidor a Windows Server 2016 donde ya estar disponible de manera automática.



    Como saber si estoy en http2?


    Puedes navegar la siguiente URL:

    https://tools.keycdn.com/http2-test



    Google Chrome

    En la ventana de inspeccionar (clic derecho inspeccionar) de Google Chrome vas a pestaña de Network, tienes que agregar la columna de protocolo y refrescas la página (cmd + R).



    Si deciden quedarse en HTTP 1.1 aquí algunos consejos de mejora de rendimiento.

    Ver

    jueves, 10 de marzo de 2016

    Instalar OCI en Windows

    3 comentarios:

    Para poder acceder a una base de datos oracle desde php, python en windows necesitas instalar OCI  aquí los pasos para instalar en windows server con IIS.

    Debe de tener instalado IIS y php para ver instalar revisar este vinculo.

    Instalar PHP en windows IIS

    Instalado OCI 12C


    1.) Primer paso debe ser instalar el cliente básico de oracle 12C, el cual pueden descargar de Instant Client debe asegurase que debe ser 32 bits, ya que php es 32 bits.

    http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html

    Descargue y des comprima el cliente de oracle 12C 21 bit en :

    C:\instantclient_12_1

    2.) Agregue esta ruta el path del sistema operativo.

    2.1) Panel de control, seleccione System,






    2.2) En system ingrese a Advanced System settings

    2.3 ) Ingrese a variables de Entorno.



    2.4) En la ventana de Variables de ambiente seleccione Path y luego Edit....




    2.5) Agregue a la variable path la ruta del cliente de oracle en este caso: C:\instantclient_12_1



    Install OCI8


    Para acceder a Oracle es necesario OCI8, por lo regular ya esta en las extensiones de php, si no debe de bajarlo de en PECL solo asegúrate que coincida con la versión que estas utilizando y que sea "Non Thread Safe (NTS) x86"

    En este caso en la version que descargamos de php ya tenemos la dll de OCI en nuestras extensiones, como el cliente es 12c la dll debería ser: php_oci8_12c.dll



    Configurando PHP

     Copiar el archivo php.ini-production a php.ini

    1.) Vamos a la carpeta donde esta instalado php en nuestro caso la ruta es:
     C:\Program Files (x86)\PHP\v5.6 

    Si fuera otra la puedes consultar en el PHP Manager.

    2.) Ahora borra php.ini

    3.) Copia el archivo php.ini-production

    4.) Cambia de nombre a la copia de php.ini-production a php.ini

    Habilitando php_Oci8 en php.ini

    5.) Abre php.ini y des comenta las siguientes líneas (quitar el punto y coma):

    extension_dir = "ext".

    extension=php_oci8_12c.dll


    También debe des comentar la línea de date.timezone y configurar para su región, aquí hay un listado para que busque su país. http://php.net/manual/es/timezones.php

    date.timezone = America/Los_Angeles

    Microsoft Visual C++ 

    Debes asegurarte que el Microsoft Visual C++ este instalado tanto el 2010 como el 2012, seguramente ya tienes instalado el 2012 ya que es para que php funcione.

    Install Microsoft Visual C++ 2010 Runtime (x86). Necesario para OCI8

    Install Microsoft Visual C++ 2012 Runtime (x86). Necesario para php 

    Verificando la Instalación

    Hay 2 maneras de verificar que la instalación de OCI sea correcta, consola y la pagina php info.

    1.) En el command Prompt de windows: 

    C:\>php --ri oci8

    Si todo esta correcto debe dar un respuesta como esta:




    En la pagina de prueba de php donde se incluyo phpinfo también debería mostrar que esta habilitado el oci8




    Pagina de prueba.
    Crear un pagina con el nombre testoci.php


    <?php
    
    $conn = oci_connect('hr', 'welcome', 'mymachine.mydomain/orcl');
    $stid = oci_parse($conn, 'select table_name from cat');
    oci_execute($stid);
    
    echo "<table>\n";
    while (($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) != false) {
        echo "<tr>\n";
        foreach ($row as $item) {
            echo "  <td>".($item !== null ? htmlentities($item, ENT_QUOTES) : "&nbsp;")."</td>\n";
        }
        echo "</tr>\n";
    }
    echo "</table>\n";
    
    ?>
    
    Ver