Publicado poralegg | En MySQL, PHP | Posted on 14-06-2010
1
No se si es algo muy novedoso, pero yo lo he conocido hoy leyendo Administra tu MySQL con Adminer. En un archivo php tenemos un administrador de base de datos bastante decente. Muy útil para cuando no tenemos acceso a algun panel a la base directamente, subimos el archivo y ya podemos acceder sin necesidad de subir todo un admin, como el phpmyadmin.
Publicado poralegg | En PHP, Seguridad | Posted on 05-04-2010
1
Siguiendo con estos posteos en la categoria “paranoia”, encontre esta clase PHP, que nos permite analizar y detectar posible ataques HTTP a nuestras páginas. Para bajar la clase, en este link.
Necesitaba elegir un Datapicker o selector de fecha…para un proyecto en donde funcionan varios calendarios al mismo tiempo. Probe bastantes y finalmente me quede con jQuery Datapicker, uno de los mas livianos de la lista.
Publicado poralegg | En PHP | Posted on 14-10-2009
1
RavenNuke, como su nombre hace sospechar, es un CMS desarrollado en base al muy popular PHP Nuke. La idea de los creadores fue hacer una version mas segura, estable y con nuevas especificaciones. Habra que probarlo.
Publicado poralegg | En PHP | Posted on 28-09-2009
0
Para los programadores Java, la persistencia de objetos es algo bastante más habitual que en el desarrollo PHP. Estas clases nos pueden ayudar a trabajar con objetos.
Publicado poralegg | En APIS, PHP | Posted on 08-09-2009
0
Para un proyecto reciente me han pedido mostrar en una pagina algunos datos generados por Google Analytics. Para hacerlo, podemos utilizar la Data Export API.
Conectar a nuestra cuenta de Analytics, es muy fácil utilizando la libreria de PHP, curl.
Publicado poralegg | En PHP | Posted on 26-08-2009
1
Hace un par de días necesitaba para un proyecto, que determinados clientes puedan acceder a las bases de datos del servidor, desde si mini panel en el sitio web. Encontre esta clase que me ayudo bastante.
/**
* Name: cPanel Database Class
* Version: 1.0
* Author: The HungryCoder
* Contact: thehungrycoder@gmail.com
* Homepage: www.hungrycoder.xenexbd.com
*/
class cpanel_db {
protected $cpdomain;
protected $cpuser;
protected $cppass;
protected $cptheme;
private $error;
public $callresult;
function __construct($cpdomain,$cpuser,$cppass,$cptheme='x3'){
$this->cpdomain = $cpdomain;
$this->cpuser = $cpuser;
$this->cppass = $cppass;
$this->cptheme = $cptheme;
}
private function callUrl($urlsuffix){
if(empty($urlsuffix)) return $this->error('URL is empty');
$url = "http://".$this->cpdomain.":2082/frontend/".$this->cptheme.$urlsuffix;
$this->callresult=''; //reset
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_USERPWD, "$this->cpuser:$this->cppass");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// curl_setopt($ch, CURLOPT_VERBOSE , 1 );
$this->callresult = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);
return $info;
}
/**
* Create Database
*
* @param string $dbname
* @return boolean
*/
public function createDb($dbname){
$suffix = "/sql/addb.html?db=$dbname";
//return $this->callresult;
$this->callUrl($suffix);
return $this->isSuccess('db');
}
public function createUser($username,$pass){
$suffix = "/sql/adduser.html?user=$username&pass=$pass&pass2=$pass";
//return $this->callresult;
$this->callUrl($suffix);
return $this->isSuccess('user');
}
public function grantPriv($db,$user){
//prepare the params
$params = "db=$db&user=$user&update=&ALL=ALL&SELECT=SELECT&CREATE=CREATE&INSERT=INSERT&ALTER=ALTER&UPDATE=UPDATE&DROP=DROP&DELETE=DELETE&LOCKTABLES=LOCK&INDEX=INDEX&REFERENCES=REFERENCES&CREATETEMPORARYTABLES=TEMPORARY&CREATEROUTINE=CREATEROUTINE";
$callurl = "/sql/addusertodb.html?$params";
$this->callUrl($callurl);
return $this->isSuccess('grant');
}
private function isSuccess($type='db'){
switch ($type){
case 'db':
if(eregi('Added the database',$this->callresult)){
return true;
} else {
return false;
}
break;
case 'user':
if(eregi('Added user',$this->callresult)){
return true;
} else {
return false;
}
break;
case 'grant':
if(eregi('was added to the database',$this->callresult)){
return true;
} else {
return false;
}
break;
case 'deldb':
if(eregi('deleted the database',$this->callresult)){
return true;
} else {
return false;
}
break;
case 'deluser':
if(eregi('Deleted the user',$this->callresult)){
return true;
} else {
return false;
}
break;
}
}
public function error($msg){
$this->error = $msg;
return false;
}
public function runBatch($dbname,$dbuser,$dbpass){
if(empty($dbname) OR empty($dbuser) OR empty($dbpass)) return false;
$result = array();
//create the database
$result['db'] = $this->createDb($dbname);
//create the user
$result['user'] = $this->createUser($dbuser,$dbpass);
//grant the access with real db name and username
$result['grant'] = $this->grantPriv($this->cpuser.'_'.$dbname,$this->cpuser.'_'.$dbuser);
return $result;
}
/**
* This method deletes a number of databases from cpanel.
*
* @param array $dbs
* @return array
*/
public function delDb($dbs){
//this method will delete a number of dbs.
if(is_array($dbs)){
foreach ($dbs as $db){
$db_full_name = $this->cpuser .'_'.$db;
$suffix = "/sql/deldb.html?db=$db_full_name";
$this->callUrl($suffix);
$result[$db] = $this->isSuccess('deldb');
}
return $result;
} else {
$this->error('Not an array');
}
return false;
}
/**
* This method deletes a number of users from cpanel.
*
* @param array $dbs
* @return array
*/
public function delUser($users){
//this method will delete a number of dbs.
if(is_array($users)){
foreach ($users as $user){
$user_full_name = $this->cpuser .'_'.$user;
$suffix = "/sql/deluser.html?user=$user_full_name";
$this->callUrl($suffix);
$result[$user] = $this->isSuccess('deluser');
}
return $result;
} else {
$this->error('Not an array');
}
return false;
}
/**
* Find whether a database is exists in cPanel or not!
*
* @param string $dbname Do not include the database name prefix (anything before _).
* @return boolean
*/
public function isDbExists($dbname,$limit=100){
$suffix = "/sql/index.html?itemsperpage=$limit";
$this->callUrl($suffix);
$html = $this->callresult;
$html = substr($html,stripos($html,'
'));
$html = str_ireplace('','BR',$html);
$html = strip_tags($html);
$all_db = explode('BR',$html); //array of all databases.
//trim the whitespaces surrounding the dbname
$all_db = array_map('trim',$all_db);
//print_r($all_db);
if(in_array($this->cpuser.'_'.$dbname,$all_db)){
return true;
} else {
return false;
}
}
public function isUserExists($username,$limit=100){
$suffix = "/sql/index.html?itemsperpage=$limit";
$this->callUrl($suffix);
$html = $this->callresult;
$html = substr($html,stripos($html,'
'));
$html = str_ireplace('','BR',$html);
$html = strip_tags($html);
$all_user = explode('BR',$html); //array of all databases.
//trim the whitespaces surrounding the dbname
$all_user = array_map('trim',$all_user);
//print_r($all_db);
if(in_array($this->cpuser.'_'.$username,$all_user)){
return true;
} else {
return false;
}
}
}
Usando la clase
error_reporting(E_ALL);
include('cpanel_mysql.class.php');
$db = new cpanel_db('domain','user','pass');
//create db
if($db->createDb('cpdb')){
echo 'Db Created';
} else {
echo 'Db not created';
}
//create user
if($db->createUser('cpuser','3837djd')){
echo 'User Created';
} else {
echo 'User not created';
}
//grant access
if($db->grantPriv('cpdb','cpuser')){
echo 'Priv granted';
} else {
echo 'Priv not granted';
}
//we can run the above three by this single line:
//$result = $db->runBatch('batch','batch','elkdrlfd');
//we can now check the result
print_r($result);
//del database
$db->delDb(array('db1','db2','db3'));
//del users
$db->delUser(array('user1','user1','user3'));
//we can also check whether a db/user exists
if($db->isUserExists('cpuser')) echo 'User exists';
if($db->isDbExists('cpdb')) echo 'Db exists';
Publicado poralegg | En Optimización, PHP | Posted on 17-08-2009
1
Tengo este listado desde hace un tiempo y aunque quizás le falte un poco de actualización, no viene mal tenerlo en cuenta.
1. Si un método puede ser static, decláralo estático. La velocidad se incrementa en un factor de 4.
2. echo es más rápido que print, aunque la diferencia es despreciable.
3. Inicializa el contador de tus bucles for antes y no en el propio bucle.
4. Si tienes que iterar un objeto o un array, utiliza SPL en lugar de bucles recursivos.
5. Destruye las variables que ya no utilices con unset() para liberar memoria, especialmente si son objetos o arrays pesados. Si utilizas OOP, revisa el destructor __destruct() en este sentido.
6. Si tienes que recorrer un array enorme y no te interesa guardarlo, considera utilizar array_shift() para ir leyendo y borrando a la vez.
7. No abuses de __get(), __set() y __autoload().
8. require_once() es pesado. Muy pesado en PHP < 5.0.
9. Utiliza paths absolutos a los ficheros en los include() y require(), el SO tarda menos en resolver las rutas al fichero.
10. Si necesitas saber el timestamp de acceso a un script, considera utilizar $_SERVER['REQUEST_TIME'] en lugar de time()
11. Comprueba si puedes usar strncasecmp(), strpbrk() y stripos() en lugar de expresiones regulares.
12. str_replace() es más rápido que preg_replace(), pero strtr() es hasta 4 veces más rápido que str_replace().
13. Si la función, como la función de reemplazo de cadenas, acepta dos arrays y un carácter como argumentos, y tu lista de argumentos no es muy larga, considera escribir varias sentencias de reemplazo redundantes, pasando un carácter cada vez, en lugar de una linea de código que acepte arrays como búsqueda y reemplazo.
14. La supresión de errores con @ es bastante ineficiente a la par que desaconsejable.
15. eval() is evil (y además horrorosamente lento).
16. $row['id'] es hasta 7 veces más rápido que $row[id]
17. Si una variable de clase es constante, utiliza const.
18. Los mensajes de error son ineficientes, utilizalos sólo cuando sea necesario.
19. No uses funciones dentro de los bucles, como for ($x=0; $x < count($array); $x++). La función count() se ejecuta cada vez que se repita el bucle. 20. Incrementar una variable local en un método es lo más rápido. Casi lo mismo que llamar a una variable local en una función. 21. Incrementar una variable global es dos veces más lento que hacerlo con una variable local. 22. Incrementar una propiedad de un objeto (por ejemplo $this->prop++) es 3 veces más lento que hacerlo sobre una variable local.
23. Incrementar una variable indefinida es hasta 10 veces más lento que hacerlo en una ya inicializada.
24. Declarar una variable global sin utilizarla también enlentece la ejecución. PHP comprueba si existe.
25. La cantidad de métodos definidos en una clase no afecta al rendimiento.
26. Los métodos de la clase concreta se ejecutan más rápidos que los de la clase base.
27. $localvar++ es hasta 15 veces más rápido que function inc(){ $localvar++; }.
28. Las cadenas encerradas entre comillas simples son más rápidas que las que lo están con comillas dobles porque PHP no expande las variables que puedan contener. Si usas PHP 5+, la diferencia es mínima.
29. Cuando se aplica echo a una lista de cadenas por argumento, es más rápido separarlas con una coma (,) en lugar del operador de concatenación (.). Esto sólo funciona con echo por ser una construcción del lenguaje y no una función.
30. Un script PHP es servido por Apache entre 2 y 10 veces más lento que una página estática. Cachea resultados cuando sea posible.
31. Los scripts PHP se “compilan” cada vez que son ejecutados a menos que se guarde el código objeto en un cache. Las diferentes herramientas de compilación de PHP incrementan el rendimiento hasta un 100%.
32. Puestos a cachear, Memcached es mucho más rápido y versátil que un cache a disco. APC también da buen resultado pero es menos escalable.
33. Usa ip2long() y long2ip() para almacenar direcciones IP como números en lugar de como cadenas. Reduce el espaco en un factor de 4 y los cálculos de rango, máscara y ordenaciones son más sencillos y rápidos.
34. Usa la extensión SOAP nativa en lugar de NuSOAP.
35. Valida las direcciones de correo electrónico con checkdnsrr().
36. php_filter() mejor y más rápido que tu sistema home made de validación.
37. Las funciones mysql_* son más lentas que mysqli_*, pero no tan eficientes como el driver mysqlnd para PDO (disponible en el inminente PHP 5.3)
38. Usa sentencias preparadas, en lugar de concatenar las consultas a mano, para mejorar el rendimiento y frenar significativamente las SQL-Injections.
39. No reinventes la rueda, mira a ver si puedes aprovechar algo de PEAR, PECL, SourceForge, CakePHP, CodeIgniter, Zend Framework, …
40. Utiliza highlight_file() para postear código formateado y bonito en los foros (por favor!!).
41. Si guardas un objeto o array serializado en la base de datos, considera usar gzcompress() y gzuncompress() para ahorrar espacio. GZip puede reducir el tamaño de un texto plano hasta en un 90%.
42. El operador ternario no es más rápido que un if-else.
43. empty() es más rápido que $var == ”, pero es más rápido el operador identidad $var === ”. En general la identidad es más rápida en cualquier situación.
44. do-while es más rápido que while, pero más lento que for. Lo primero a optimizar de un programa son los bucles
45. Si necesitas determinar si una cadena tiene un cierto tamaño, es más rápido utilizar la construcción del lenguaje !isset($str{5}) que la función strlen($str) < 5
46. el preincremento ++$i es más rápido que el postincremento $i++ debido a interioridades del interprete de Zend, de echo es una de las optimizaciones a nivel de OPCODE más utilizadas por los compiladores de PHP.
47. Usa preg_* en lugar de ereg_*, está a punto de desaparecer y es mucho más lento.
48. Usa direcciones IP en lugar de nombres de dominio.
49. El manejador de flujos ob_start() puede aumentar el rendimiento hasta en un 25%.
50. El paso de argumentos por referencia en PHP no es igual al paso de una referencia en C mediante un puntero. En PHP una referencia sirve para acceder a una variable mediante dos nombres distintos (nombre de variable y valor de la variable son cosas distintas en PHP). Por tanto pasar arrays por referencia como en C, en realidad, es más lento que hacerlo por valor. En PHP 5+ los objetos se pasan explícitamente por referencia.
51. Un uso apropiado de las referencias como alias de nombre de variable:
$a['b']['c'] = array();
// 2 accesos por iteración a la tabla hash
// donde PHP almacena las variables
for($i = 0; $i <5; $i++)
$a['b']['c'][$i] = $i;
// con un alias por referencia es mas rápido
$ref =& $a['b']['c'];
for($i = 0; $i < 5; $i++)
$ref[$i] = $i;
52. La manera más rápida a este lado de Rio Grande para detectar si el SO es Unix o no es utilizar la constante DIRECTORY_SEPARATOR.
53. La manera más rápida de concatenar muchas cadenas de poco tamaño es abrir un flujo de salida con ob_start() y hacer un echo de todas ellas para despues recoger la cedena final con ob_get_contents(). Esto es así porque en el tratamiento de cadenas el factor limitante es la reserva de memoria y al crear un flujo se reservan de golpe 40K, aumentando en pedazos de 10K cuando hace falta más.
54. En las sentencias switch() ordena los casos empezando por los más frecuentes.
55. Procesar ficheros XML con expresiones regulares es más rápido que hacerlo con SAX o DOM. Atención: el uso de expresiones regulares para procesar XMl puede acortar significativamente su esperanza de vida.
56. Eliminar los comentarios o escribir en una sola linea no hace que se ejecute más rápido, lo único que consigues es que los demás te odien a muerte.
57. Usar objetos no hace que todo sea más rápido, más bien al contrario, pero utilizarlos mejora otras muchas cosas.
58. Cuanto menos (x)HTML en la salida del script, más rápido renderiza la pagina.
59. Utiliza constantes en lugar de funciones: PHP_VERSION vs. php_version(), PHP_OS vs. php_uname(), PHP_SAPI vs. php_sapi_name(), etc.
60. Si todo lo demás falla … escribe una extensión en C.
Publicado poralegg | En PHP | Posted on 17-08-2009
1
Leyendo sobre GD para un proyectito que tengo que hacer, di con esta funcion imagerotate(). Seguramente es muy conocida, pero nunca la habia utilizado. Como su nombre lo indica, lo que hace es rotar una imagen, en la cantidad de grados que le pasemos.
// Imagen que se va a rotar
$imagen = 'imagen.jpg';
// Grados de rotacion
$grados = 180;
// Cabeceras
header('Content-type: image/jpeg') ;
// Crear el canvas
$source = imagecreatefromjpeg($imagen) ;
// Rotar usando imagerotate
$img_rotada = imagerotate($source, $grados, 0) ;
// Salida de la imagen
imagejpeg($img_rotada) ;