Saltar al contenido

En muchas ocasiones tienes un script de sql que la memoria de php o un timeout no te permite cargar desde el PhPMyAdmin con un sencillo "Importar".

Debes saber que con el propio XAMPP se instala MySQL y lleva una suite de utilidades que te permiten hacer muchas viguerías con la bases de datos. Incluso en Windows.

Te voy a explicar como importar una base de datos MySQL desde la consola de Windows.

  1. Abre la consola con el comando "cmd" y sitúate en la carpeta bin en el directorio de instalación de MySQL, si tienes XAMPP lo tienes en:
    C:\xampp\mysql\bin
  2. En esta carpeta tienes todas las utilidades, utilizaremos mysql.exe y ejecutaremos el siguiente comando:
    mysql -h localhost -u root --default-character-set=utf8 nombrebd < C:\rutadel.sql

NOTAS IMPORTANTES:

  • localhost si lo tienes en local, sino tu ip de máquina.
  • root o el nombre de usuario, si tienes contraseña ponla a continuación
  • pon el character set por defecto
  • la ruta del fichero sql debe ser absoluta
  • el fichero debe ser .sql y no estar comprimido

Otro apunte muy a tener en cuenta es que si nos hemos descargado un volcado del phpmyadmin del servidor tendrás claves ajenas y/o otras restricciones que no permitirán la inserción en el orden que se ha generado las tablas del script. Puedes anular estas restricciones simplemente abriendo el fichero y poniendo:

SET FOREIGN_KEY_CHECKS=0;

De esta forma entrará todo el script sin validar las restricciones.

 

Cambiar la conexión:

function db_conectar()
{
 $db = mysqli_connect($GLOBALS['configuration']['host'],$GLOBALS['configuration']['user'],$GLOBALS['configuration']['pass'],$GLOBALS['configuration']['db']);
 
if (!$db) {
 echo "Error: No se pudo conectar a MySQL." . PHP_EOL;
 echo "errno de depuración: " . mysqli_connect_errno() . PHP_EOL;
 echo "error de depuración: " . mysqli_connect_error() . PHP_EOL;
 exit;
 }
 else {return $db;}
}

Solo he tenido que hacer un replace con:

mysql_query(    ---------------->   mysqli_query($db,
mysql_num_rows( ---------------->    mysqli_num_rows(
mysql_fetch_array(  ---------------->   mysqli_fetch_array(
mysql_free_result(  ---------------->   mysqli_free_result(
MYSQL_ASSOC  ---------------->   MYSQLI_ASSOC
mysql_result(  ---------------->   mysqli_result(
mysql_real_escape_string( ------> mysqli_real_escape_string($db,

Otro de los ajustes que me he encontrado a la hora de la migración entre servidores con distintas versiones de PHP es el siguiente mensaje:

Strict Standards: mktime(): You should be using the time() function instead in xxxxxxx.php on line xx

El problema viene por la función mktime() y resolverlo es sencillo, ya que solo se deberá sustituir por la función time()

Inicialmente, la función mktime tiene los siguientes argumentos:

int mktime ([ int $hour = date("H") [, int $minute = date("i") [, int $second = date("s") [, int $month = date("n") [, int $day = date("j") [, int $year = date("Y") [, int $is_dst = -1 ]]]]]]] )

A partir de PHP 5.1 se utiliza la función time() y no se pasan argumentos para diferenciarla.

Muchas veces tenemos problemas de seguridad en nuestras páginas webs, es altamente recomendable tener preparadas tareas automáticas para que se ejecuten y salven los datos cada cierto tiempo. Con el siguiente script realizamos una copia de las tablas que deseamos exceptuando los nombres de las que pasamos como parámetro, en mi caso los logs no los copio.

Backup

backup_tables('servidor','usuario','contrasena','bd','tabla1,tabla2');
 
function backup_tables($host,$user,$pass,$name,$tablesNo)
 {
 $link = mysql_connect($host,$user,$pass);
 mysql_select_db($name,$link);
 
//get all of the tables
 $tables = array();
 $tablesNoBackup = explode(',',$tablesNo);
 
$result = mysql_query('SHOW TABLES');
 while($row = @mysql_fetch_row($result))
 {
 $tables[] = $row[0];
 }
 
//cycle through
 foreach($tables as $table)
 {
 if(!in_array($table, $tablesNoBackup))
 {
 $result = mysql_query('SELECT * FROM '.$table);
 $num_fields = mysql_num_fields($result);
 
$return.= 'DROP TABLE '.$table.';';
 $row2 = mysql_fetch_row(mysql_query('SHOW CREATE TABLE '.$table));
 $return.= "\n\n".$row2[1].";\n\n";
 
for ($i = 0; $i &lt; $num_fields; $i++)
 {
 while($row = mysql_fetch_row($result))
 {
 $return.= 'INSERT INTO '.$table.' VALUES(';
 for($j=0; $j&lt;$num_fields; $j++)
 {
 $row[$j] = addslashes($row[$j]);
 $row[$j] = ereg_replace("\n","\\n",$row[$j]);
 if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
 if ($j&lt;($num_fields-1)) { $return.= ','; } } $return.= ");\n"; } } $return.="\n\n\n"; } } //save file $handle = fopen('db-backup-'.date("Ymd").'-'.(md5(implode(',',$tables))).'.sql','w+'); fwrite($handle,$return); fclose($handle); }

1

Siguiendo con la herramienta que nos da Google para optimizar nuestras páginas Google PageSpeed Insights, una de las recomendaciones más comunes es la que nos indica: "Habilitar compresión".

Muchos sitios web pueden permitir comprimir con gzip u otro modulo de compresión la salida de HTTP del navegador, en sí, nosotros no tenemos que programar nada, simplemente activar esta configuración habilitandola en el Apache (suponiendo que nuestra web esta desarrollada con PHP).

En mi caso, mi servidor se gestiona con un panel de control CPANEL, activar dicha compresión es una tarea muy sencilla.

1. el primer paso es buscar el apartado "Software / Servicios" y hacer click en "Optimizar el sitio de Web"

Captura1

 

2. A continuación, seleccionamos "Comprimir todo el contenido". Aunque existe la posibilidad de marcar "Comprimir los tipos de MIME especificados" que lo único que comprimirá serán los formatos MIME indicados.

Captura2

 

Resumiendo, habilitar la compresión gzip de un sitio hoy en día es imprescindible para optimizar los tiempos de carga de una web, los usuarios con ancho de banda lo notarán significativamente y además de mejorar tu puntuación en las valoraciones SEO, la navegación será más fluida.

Enlace a Google PageSpeed Insightshttp://developers.google.com/speed/pagespeed/insights/

Explicación de Google sobre la habilitación de la compresión (inglés): https://developers.google.com/speed/docs/insights/EnableCompression

Cuando  hacemos un test en Google PageSpeed Insights y nos da como una mejora que debes introducir "Especificar cache del navegador", nos da la siguiente explicación:

https://developers.google.com/speed/docs/insights/LeverageBrowserCaching

Captura

 

 

En realidad lo que nos quiere decir es que para mejorar la experiencia de usuario a la hora de cargar la web, el contenido estático como imágenes, hojas de estilo y javascript le podemos indicar una fecha de expiración para que no se cargue cada vez que el usuario accede a la página. Esto se puede hacer muy fácilmente, hay dos opciones, desde PHP o desde .htacces. La primera opción te va permitir decir que páginas quieres que se aplique, en la segunda y más recomendable se aplicará a todo el conjunto de páginas.

Aunque se puede expresar la directiva de tiempo con palabras tipo days, week, moth a mi me gusta más la forma numérica y expresarlo en segundos, de esta forma se calcula así:

- ExpiresDefault A3600 una hora
- ExpiresDefault A604800 para una semana

Y se calcula de la siguiente forma: 30 dias = 60*60*24*30 = 2592000

Expiración utilizando .htacces

<ifmodule mod_expires.c>
 ExpiresActive On
 ExpiresDefault A3600
 <FilesMatch ".(gif|jpg|jpeg|png|swf)$">
 ExpiresDefault A604800
 Header append Cache-Control "public"
 </FilesMatch>
 <FilesMatch ".(xml|txt|html)$">
 ExpiresDefault A604800
 Header append Cache-Control "public"
 </FilesMatch>
 <FilesMatch ".(js|css)$">
 ExpiresDefault A604800
 Header append Cache-Control "public"
 </FilesMatch>
</ifmodule>

Expiración utilizando PHP

Se realizará modificando los headers

header("Expires: ".gmdate ("D, d M Y H:i:s", time() + 60*60*24*30)." GMT");

En las siguientes referencias os dejo otras explicaciones útiles:

 

Existen webs que tardan mucho en cargarse o que pensamos que lo hacen bien pero están poco optimizadas.

Habrá que tener en cuenta varios factores, el primero la correcta programación PHP y el acceso a base de datos con consultas eficientes, lógicamente contando que tenemos un servidor medianamente potente. Después el propio contenido estático de la web: CSS, JS, imágenes, etc...

Para ello es importante tener en cuenta herramientas que nos facilitarán este análisis, a continuación muestro unas cuantas:

- páginas para realizar análisis de contenidos:

- Compresión de archivos JS:

- Plugins del navegador:

- Plugins para la web para realizar cargas concretas:

En fin, que existen multitud de herramientas, plugins y formas de optimizar la carga de una web.

 

Captura

 

1

Una redirección 301 (que es la que recomienda Google). para hacer esta redirección vamos a usar el archivo .htaccess (si no lo tienen creen uno), sólo tienen que pegar los códigos de abajo según lo que elijan.

En este paso puede hacer dos opciones:

Redireccionar el dominio viejo al home del nuevo blog

Esto es simple, cuando alguien entre a cualquier post, página o lo que sea del dominio viejo va a ser redireccionado al home de nuestro nuevo blog.

redirectMatch 301 ^(.*)$ http://www.dominionuevo.com

Redireccionar el dominio viejo al dominio nuevo con la misma estructura
Esta redirección es la mejor de todas, ya que la redirección tiene la misma estructura del dominio viejo, es decir, si alguien accede a dominioviejo.com/esto-es-un-post va a ser rdireccionado automáticamente a dominionuevo.com/esto-es-un-post. En resumen, lo que hace es cambiar “dominioviejo” por “dominionuevo”.

redirectMatch 301 ^(.*)$ http://www.dominionuevo.com$1

Una vez que hicieron la redirección es MUY importante que dejen el contenido del dominio viejo en el servidor durante un tiempo (Google creo que recomienda 4 meses, pero me parece que es menos tiempo). Ustedes vean qué les parece mejor, pero si pueden dejarlo 4 meses, mejor!

Se llaman CronJobs o Cron (en CPANEL CronJobs)

en Comando pones:

php /home/sitio/public_html/rutina.php

Esto ejecutará una página de php (o script) cada cierto tiempo que selecciones.

Hay varios valores predefinidos que se pueden utilizar para sustituir la expresión CRON.

Entrada Descripción Equivale A
@yearly Se ejecuta una vez al año 0 0 1 1 *
@annually (igual que @yearly) 0 0 1 1 *
@monthly Se ejecuta una vez al mes 0 0 1 * *
@weekly Se ejecuta una vez a la semana 0 0 * * 0
@daily Se ejecuta una vez al día 0 0 * * *
@midnight (igual que @daily) 0 0 * * *
@hourly Se ejecuta una vez cada hora 0 * * * *

 

Captura