Tips para programadores

No todo es programación. Un programador sin conocimientos de sistemas, sin conocimientos globales, queda relegado muchas veces. Es duro y difícil ser un Full Stack Developer.

PHP

PHP

Composer Fatal error: Allowed memory size of XXXXX

En servidores cPanel con CloudLinux puede haber problemas para usar uno de los sistemas recomendados por Composer puede no funcionarnos y comeinza la frustación.

Ejecución normal

$  composer update
Loading composer repositories with package information
Warning from https://repo.packagist.org: You are using an outdated version of Composer. Composer 2 is now available and you should upgrade. See https://getcomposer.org/2
Updating dependencies (including require-dev)

Fatal error: Allowed memory size of 1610612736 bytes exhausted (tried to allocate 528384 bytes) in phar:///usr/local/bin/composer1/src/Composer/DependencyResolver/Pool.php on line 230

Check https://getcomposer.org/doc/articles/troubleshooting.md#memory-limit-errors for more info on how to handle out of memory errors.Fri May  7 12:24:49 CEST 2021

Ejecución con variable de entorno

$ COMPOSER_MEMORY_LIMIT=-1 composer <arguments>

Ejecución con argumentos

En algunos escenarios puede fallarnos, por ejemplo cuando tenemos dos instancias de composer (composer v1 y composer v2) y además el sistema tiene Cloudlinux. Podemos usar la siguiente alternativa

$ php -d memory_limit=-1 composer <arguments>

Información original

Como en todo la documentación original es importante conocerla.

Aviso

Esta documentación y su contenido, no implica que funcione en tu caso o determinados casos. También implica que tienes conocimientos sobre lo que trata, y que en cualquier caso tienes copias de seguridad. El contenido el contenido se entrega, tal y como esta, sin que ello implique ningún obligación ni responsabilidad por parte de Castris

Si necesitas soporte profesional puedes contratar con Castris soporte profesional.

PHP

Cambiar la versión PHP para el shell (composer)

Introducción

Cuando un sistema linux tiene múltiples versiones de PHP (cPanel, Directadmin, sistema sin panel de control, etc) uno de los problemas habituales es como usar una versión php en la shell diferente de la que está por defecto en el sistema. Bien, puedes especificar una versión por usuario e incluso puedes hacer que el usuario use distintas versiones PHP en el mismo usuario para distintos proyectos y sin Docker, como al trabvajar con Laravel, Symfony y otros.

Archivo de configuración de mi shell

El ejemplo en este caso es para bash, pero poco difiere de otros shell (yo en lo particular uso zsh) ya que todos tienen en común un fichero de configuración que se carga cuando iniciamos sesión o cuando tras modificarlo, ejecutamos un comando para que vuelva a leer ese fichero.

Cambiar la versión PHP de tu usuario de shell en bash

Iniciar sesión con tu usuario. Asegurarnos de que estamos en el inicio de sesión

$ cd ~

Obtener el path de las versiones instaladas

# ls -lisah /usr/local/bin/php
19270949 0 lrwxrwxrwx 1 root root 26 Jun  8 08:39 /usr/local/bin/php -> /usr/local/php56/bin/php56
# ls -lisah /usr/local
ls /usr/local/
...  php71  php73  php80 ... php56   php72  php74

Agregar la línea para usar la versión requerida

# .bashrc o .bash_profile Véase su distribución
# .zshrc
export PATH=/usr/local/php80/bin:$PATH

Cpanel (v98+)

En cpanel las instalaciones de php estan en el directorio /opt/cpanel/ con la nomemclatura ea-phpXX para indicar la version por lo que el path a añadir sería export PATH=/opt/cpanel/ea-php80/root/bin/:$PATH por ejemplo

Salvar y hacer un reload de tu perfil

# bash
$ . ~/.bash_profile
# zsh
$ source ~/.zshrc

Comprobar la versión PHP de nuestro shell

php -v
PHP 8.0.5 (cli) (built: May  3 2021 11:30:57) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.5, Copyright (c) Zend Technologies
 with Zend OPcache v8.0.5, Copyright (c), by Zend Technologies

Usar alias para distintos proyectos con el mismo usuarios

En mi caso como dije uso zsh y tengo múltiples proyectos. No me gusta marearme con docker salvo para cosas específicas asi que prefiero tener unos alias en mi fichero ~/.zshrc

alias p74=’/usr/bin/php7.4 ’
alias a74='/usr/bin/php7.4 artisan '
alias c74='/usr/bin/php7.4 /usr/local/bin/composer '
Aviso

Esta documentación y su contenido, no implica que funcione en tu caso o determinados casos. También implica que tienes conocimientos sobre lo que trata, y que en cualquier caso tienes copias de seguridad. El contenido el contenido se entrega, tal y como está, sin que ello implique ningún obligación ni responsabilidad por parte de Castris

Si necesitas soporte profesional puedes contratar con Castris soporte profesional.

Laravel

Laravel, ese framework que nos tiene enamorado.

Laravel

Specified key was too long

Escenario

Despliegue de una app de laravel en un servidor. Ejecutamos el primer migrate y zas.

php artisan migrate
...
 Illuminate\Database\QueryException  : SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 1000 bytes
...

No nos asustemos; el tema está en una diferencia de versión MySQL

ATENCIÓN a programadores cada vez las diferencias entre versiones de un mismo motor son fuertes (MySQL 5.X vs MySQL 8, por ejemplo), MySQL vs MariaDB vs Percona. Algunas pueden producir serios problemas en caso de tener que recuperar un backup de otro motor o versión, o una configuración.

Posibles soluciones

Actualización del motor de Base de Datos

Si es posible lo adecuado, es que uses el mismo motor tanto en desarrollo, testing y producción. Y la misma configuración.

Tener apps profesionales, en un entorno compartido, es como ser un feriante (con respeto a su profesión). Sufriras, tu tienda o negocio no tendrá el aspecto que tendrías en un servidor dedicado o VPS, optimizado para tu negocio

Modificación del engine en tu app

Si te es imposible o no quieres actualizar tu monotr de bases de datos, intenta modificar el engine de mysql en el archivo config/database.php

'mysql' => [
   'driver' => 'mysql',
   ...
   'engine' => 'InnoDB,
   ...
],

Modificación del AppServiceProvider

Si no te funciona la anterior, puede agregar una linea en tu fichero app/Providers/AppServiceProvider.php

...
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema;
...

   public function boot()
   {
      Schema::defaultStringLength(191);
   }

Explicación

La naturaleza del problema es debido a que por defecto Laravel usa como codificación utf8mb4, con soporte para los emojis.

Enlaces y cosas sobre el tema

Aviso

Esta documentación y su contenido, no implica que funcione en tu caso o determinados casos. También implica que tienes conocimientos sobre lo que trata, y que en cualquier caso tienes copias de seguridad. El contenido el contenido se entrega, tal y como está, sin que ello implique ningún obligación ni responsabilidad por parte de Castris

Si necesitas soporte profesional puedes contratar con Castris soporte profesional.

Laravel

Consejos y trucos de Laravel. Sólo enlaces

Laravel

Muchas partes del ecosistema Laravel no se ven a simple vista en su documentación, y otras tantas sus avances son tan rápidos que uno no tiene tiempo de asimilar todo o conocer todo.

Asi que dejo aqui enlaces que me parecen muy interesantes

Enlace Keys
30 Laravel Eloquent Tips & Tricks eloquent, attributes, push()
Laravel Lang Publisher laravel, lang, publisher