• 10 удивительных вещей которые можно сделать при помощи cUrl

    cURL это  PHP расширение библиотеки libcURL, инструмент при помощи которого Вы можете симулировать веб браузер. К примеру это может быть отправка формы для авторизации на сайте и получения результирующей страницы. В этой статье я собираюсь показать вам 10 невероятных вещей, которые Вы можете сделать с помощью PHP и CURL.

    Обратите внимание, что некоторые из методов, показанные здесь, могут быть использованы для методов "черной" оптимизации а также для парсинга сайтов и кражи информации. Целью данной статьи является только ознакомление, пожалуйста, не используйте любой из фрагментов ниже в незаконных целях.

    1 - Обновление своего фейсбук статуса

    Хотите автоматически обновлять facebook статус, но не хотите заходить на facebook.com, вводить каждый раз логин и пароль, и, делать это со страниц своего сайта? Просто сохраните следующий код на вашем сервере, определить переменные, и вуаля!

    <?PHP
    /*******************************
    *	Facebook Status Updater
    *	Christian Flickinger
    *	http://nexdot.net/blog
    *	April 20, 2007
    *******************************/
    
    $status = 'Новый статус';
    $first_name = 'YOUR_FIRST_NAME';
    $login_email = 'YOUR_LOGIN_EMAIL';
    $login_pass = 'YOUR_PASSWORD';
    
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'https://login.facebook.com/login.php?m&amp;next=http%3A%2F%2Fm.facebook.com%2Fhome.php');
    curl_setopt($ch, CURLOPT_POSTFIELDS,'email='.urlencode($login_email).'&pass='.urlencode($login_pass).'&login=Login');
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_COOKIEJAR, "my_cookies.txt");
    curl_setopt($ch, CURLOPT_COOKIEFILE, "my_cookies.txt");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3");
    curl_exec($ch);
    
    curl_setopt($ch, CURLOPT_POST, 0);
    curl_setopt($ch, CURLOPT_URL, 'http://m.facebook.com/home.php');
    $page = curl_exec($ch);
    
    curl_setopt($ch, CURLOPT_POST, 1);
    preg_match('/name="post_form_id" value="(.*)" \/>'.ucfirst($first_name).'/', $page, $form_id);
    curl_setopt($ch, CURLOPT_POSTFIELDS,'post_form_id='.$form_id[1].'&status='.urlencode($status).'&update=Update');
    curl_setopt($ch, CURLOPT_URL, 'http://m.facebook.com/home.php');
    curl_exec($ch);
    ?>

    Дальше интереснее

  • https запрос при помощи cUrl на php

    Пользователи часто задают вопрос: как парсить сайты защищенные ssl сертификатами. У cURL для этого есть специальные средства. Сертификат подключается, как обычный файл плюс файл с ключами. Единственное ограничение: cURL на php понимает только сертификаты формата pem, а большинство серверов работает на связке p12+crt

    Значит нужно найти конвертор.

    Для этого нужна библиотека openssl. Если у Вас linux, то она 100% у Вас уже стоит, и вы можете пропустить этот абзац. Для меня, как для windows пользователя, придумали специальные программы для запуска подобных пакетов. После недолгих поисков по сети я нашел cygwin. Если лень возиться с отдельной установкой OpenSSL и других попутных штук то лучше при установке кликните на установку всех пакетов.

  • method_exists() против is_callable()

     Одну вещь, которую я часто вижу, когда просматриваю чужой код на php, это не правильное использование функции  method_exists(), и это требует немного разъяснений.

    Это типичный пример того, о чем я тут говорю

    if (method_exists($object, 'SomeMethod')){
      $object->SomeMethod($this, TRUE);
    }

    Цель у этого куска кода довольно проста - понять: имеет ли некий объект (переменная $object) метод с названием SomeMethod, если так то вызвать его, подав несколько аргументов на вход

  • php htmlspecialchars эквивалент на javascript

     Самая простая и удобная

    function htmlspecialchars( html){
      var div =  document.createElement('div');
      div.innerText = html;
      return div.innerHTML;
    }
    

    но это работа с дом. Медленно.

    Другой вариант.

    function htmlspecialchars(str) {
     if (typeof(str) == "string") {
      str = str.replace(/&/g, "&amp;"); /* must do &amp; first */
      str = str.replace(/"/g, """);
      str = str.replace(/'/g, "&#039;");
      str = str.replace(/</g, "<");
      str = str.replace(/>/g, ">");
      }
     return str;
     }

    далее

  • php вызов анонимной функции

    К сожалению  в PHP нет аналога Javascript-конструкции (function() {})(); т.е. самовызов анонимной функции. Но его можно эмулировать, к примеру так: 

    
    
    echo call_user_func(function() use ($vars){
    	return 'Привет';
    }).' Мир!!!';

    очень удобная конструкция, не находите!?

  • PHP класс для быстрой пакетной обработки изображений

    Представляю Вашему вниманию класс для пакетной обработки файлов jimage. Класс позволяет делать тумбики изображений, создавать коллаж из десятка картинок, и применять различные gd эффекты к изображениям. А также комбинировать все эти действия.

    Класс написан мной для конкретного проекта, и с тех пор успешно применяется во других. Исходный код на гитхабе.

    Покажу, как использовать на примере создания тумбиков или если говорить научным языком маленьких копий изображений.

    <?php 
    define('ROOT',dirname(__FILE__)); // для работы скрипта должна быть объявлена
    // эта константа содержащая корень сайта
    include "class.jimage.php";
    $ji = new jimage();
    $ji->thumb(ROOT.'/img/1.png',ROOT.'/img/mini_1.png',100);

    элементарно и просто. У метода есть ряд настроек, первой идет путь до изображения. Второй путь до итогового тумбика, 3 и 4 это размеры по ширине и высоте соответственно, 5 - ый параметр это флаг, который может иметь несколько значений 

    USE_HOWSET или '' - и ширина и высота должны быть заданы, размер итогового тумбика задается строго, изображение обычно искажается
    USE_WIDTH или 'w' - задается только ширина итогового тумбика, высота считается пропорционально по заданному изображению
    USE_HEIGHT или 'h' - тоже только по высоте
    USE_AUTO или 'a' - по умолчанию, задаем и высоту и ширину, если входящее изображение вертикальное то размеры тумбика расчитываются так, чтобы все изображение влезло в заданные пределы.

    Поясню все варианты на примерах, возьмем за основу изображение красавицы Хайден Панеттьери

  • PHP Сниппеты

    Получить реальный IP пользователя

    function get_ip() {
        //Just get the headers if we can or else use the SERVER global
        if ( function_exists( 'apache_request_headers' ) ) {
            $headers = apache_request_headers();
        } else {
            $headers = $_SERVER;
        }
        //Get the forwarded IP if it exists
        if ( array_key_exists( 'X-Forwarded-For', $headers ) && filter_var( $headers['X-Forwarded-For'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 ) ) {
            $the_ip = $headers['X-Forwarded-For'];
        } elseif (array_key_exists('HTTP_X_FORWARDED_FOR', $headers ) && filter_var($headers['HTTP_X_FORWARDED_FOR'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
            $the_ip = $headers['HTTP_X_FORWARDED_FOR'];
        } else {
            $the_ip = filter_var( $_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 );
        }
        return $the_ip;
    }

    Отправить POST запрос на PHP

    function postRequest($url, $post = 0){
    	$ch = curl_init();
    	curl_setopt($ch, CURLOPT_URL, $url ); // отправляем на
    	curl_setopt($ch, CURLOPT_HEADER, 0); // пустые заголовки
    	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // возвратить то что вернул сервер
    	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // следовать за редиректами
    	curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);// таймаут4
    	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    	curl_setopt($ch, CURLOPT_COOKIEJAR, dirname(__FILE__).'/cookie.txt'); // сохранять куки в файл
    	curl_setopt($ch, CURLOPT_COOKIEFILE,  dirname(__FILE__).'/cookie.txt');
    	curl_setopt($ch, CURLOPT_POST, $post!==0 ); // использовать данные в post
    	if($post)
    		curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
    	$data = curl_exec($ch);
    	curl_close($ch);
    	return $data;
    }

    Пользоваться так

     

    $data = postRequest('https://www.google.com/recaptcha/api/siteverify', array('secret'=>'','response'=>'', 'remoteip'=>''));

    Как найти, где находится функция php

    $reflFunc = new ReflectionFunction('function_name');
    print $reflFunc->getFileName() . ':' . $reflFunc->getStartLine();

    Как найти, где находится класс в php

    идентично верхнему коду, можно найти и местоположение любого не встроенного класса в php

    $ref = new ReflectionClass('Application'); 
    print $ref->getFileName() . ':' . $ref->getStartLine();

    Как получить все методы у объекта или класса в php

    print_r(get_class_methods($obj));

    Как удалить папку с файлами или почистить папку с файлами

    function cleanDirectory($dir, $remove = false) {
    	if ($objs = glob($dir."/*")) {
    		foreach($objs as $obj) {
    			is_dir($obj) ? cleanDirectory($obj, true) : unlink($obj);
    		}
    	}
    	if ($remove) {
    		rmdir($dir);
    	}
    }

    пользуемся так

    Если нужно просто отчистить директорию то запускаем без второго параметра, если после очистки нужно еще и удалить ее то вторым параметром подаем true

    cleanDirectory('/home/www/files/images'); // очистка
    cleanDirectory('/home/www/files/images', true); // удаление

    Как отдать на загрузку какой-либо файл на сервере с помощью php

    универсальный загрузчик выглядит так

    function download ($file) {
    	if (!empty($file) and file_exists($file) and is_file($file)) {
    		if (ob_get_level()) {
    			ob_end_clean();
    		}
    
    		header('Content-Description: File Transfer');
    		header('Content-Type: application/octet-stream');
    		header('Content-Disposition: attachment; filename=' . basename($file));
    		header('Content-Transfer-Encoding: binary');
    		header('Expires: 0');
    		header('Cache-Control: must-revalidate');
    		header('Pragma: public');
    		header('Content-Length: ' . filesize($file));
    		
    		if ($fd = fopen($file, 'rb')) {
    			while (!feof($fd)) {
    				print fread($fd, 1024);
    			}
    			fclose($fd);
    		}
    	} else {
    		header('HTTP/1.0 404 Not Found');
    		echo 'File not found';
    	}
    	exit();
    }

    Сгенерировать строку из случайных символов

    Часто надо сгененрировать случайную строку для соли или еще для чего

    function generateHash ($length = 8){
    	$password = "";
    	$possible = "2346789bcdfghjkmnpqrtvwxyzBCDFGHJKLMNPQRTVWXYZ";
    	$maxlength = strlen($possible);
    	if ($length > $maxlength) {
    		$length = $maxlength;
    	}
    	$i = 0; 
    	while ($i < $length) { 
    		$char = substr($possible, mt_rand(0, $maxlength-1), 1);
    		if (!strstr($password, $char)) { 
    			$password .= $char;
    			$i++;
    		}
    	}
    	return $password;
    }

     

    универсальный загрузчик выглядит так

    Узнать, пришел ли запрос через AJAX

    Этот способ работает только с jQuery. Она при AJAX запросе добавляет заголовок HTTP_X_REQUESTED_WITH=XMLHttpRequest в запрос

    Поэтому, можно написать на сервере функцию проверки

    function isAjax(){
    	return isset($_SERVER['HTTP_X_REQUESTED_WITH']) and $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest';
    }

     

     

  • PHP Универсальный RSS Генератор (поддерживает RSS 1.0, RSS 2.0 и ATOM)

    RSS канал на свой блог я прикрутил давно, взяв php скрипт  из Danneo CMS. Вот только радость моя была не долгой, скрипт не давал валидный rss, и любимая Opera кричала что-то невразумительное об ошибке XML. Тогда я решил написать rss генератор сам,  но так как не очень люблю строить велосипеды, сперва я решил поискать готовое решение.

    Попробовав кучу скриптов мой выбор пал на скрипт из phpclasses.org, также можете скачать на моем сайте

    Скрипт поддерживает генерацию:

    • RSS 1.0 
    • RSS 2.0
    • ATOM 1.0

     

  • Автоматический переводчик текста на PHP через Google Translate

    Не так давно Google закрыл API для своего Google Translate, в результате множество скриптов для автоматического перевода текста просто перестали работать. Программисты вынуждены были написать скрипт, который парсит переведенный текст из самого переводчика. Этот класс может переводить тексты между двумя языками с помощью Google Translate. Он может послать HTTP  запрос  на  сайт и перевести текст между двумя заданными языками.
    Класс парсит возвращенную Google Translate страницу результата и возвращает переведенный текст извлеченный из страницы.

  • Автоматическое определение мобильных браузеров

      Автоматическое определение мобильных браузеров на PHPВпервые в своей практике, делал мобильную версию сайта. Должен скачать, что сделать сайт, который одинаково работал бы на огромном зоопарке мобильных браузеров,  задача не из легких. Однако, в этой статье речь пойдет не об этом.

       После того, как сайт был готов, возникла необходимость автоматически определять с какого типа устройств зашел пользователь, и отправлять его на соответствующую версию сайта. 

      Самый верный вариант: проверять возможности браузера при помощи js и затем перенаправлять. Но, это не подходит если мы не хотим чтобы пользователь грузил лишние килобайты, а автоматически был перенаправлен на нужную страничку. Поэтому требовалось серверное решение. 

  • Доступ к почтовому ящику POP3 с помощью PHP

    http://riobautista.wordpress.com/2008/01/08/accessing-a-pop3-mailbox-using-php/

    http://www.damnsemicolon.com/php/parse-emails-in-php-with-email-piping-part-2

    http://www.damnsemicolon.com/php/php-parse-email-body-email-piping

  • Изменение раскладки строки в PHP или Punto Switcher на php

    В очередной раз написав "поиск" для проекта задумался о его удобстве. Очень малое число людей владеет слепым методом печати, поэтому вводят не глядя на экран. В результате появляются такие вещи типа «Bpvtytybt hfcrkflrb cnhjrb d ЗРЗ bkb Згтещ Ыцшесрук yf зрз» (Изменение раскладки строки в PHP или Punto Switcher на php). Заставлять юзера вводить текст заново, как-то не гуманно. Яша и Гугл автоматически подбирают верный вариант. Чем мы хуже.

    Чтобы поиск был более-менее адекватный, надо переводить раскладку во все возможные варианты написания, к примеру: «hfcrkflrf ЗРЗ» нужно перевести в «раскладка ЗРЗ»  и  «раскладка PHP» и проверить все три варианта. По хорошему надо делать 3 разных запроса и выводить данные по тому, который вернул больше всего данных, либо выводить все варианты, но тот что находит больше всего выводить выше.

  • Использование cURL в PHP для HTTPS(SSL/TLS) доступа к защищенным сайтам

    From PHP, you can access the useful cURL Library (libcurl) to make requests to URLs using a variety of protocols such as HTTP, FTP, LDAP and even Gopher. (If you’ve spent time on the *nix command line, most environments also have the curl command available that uses the libcurl library)

    In practice, however, the most commonly-used protocol tends to be HTTP, especially when using PHP for server-to-server communication. Typically this involves accessing another web server as part of a web service call, using some method such as XML-RPC or REST to query a resource. For example, Delicious offers a HTTP-based API to manipulate and read a user’s posts. However, when trying to access a HTTPS resource (such as the delicious API), there’s a little more configuration you have to do before you can get cURL working right in PHP.

    The problem

    If you simply try to access a HTTPS (SSL or TLS-protected resource) in PHP using cURL, you’re likely to run into some difficulty. Say you have the following code: (Error handling omitted for brevity)
    // Initialize session and set URL.
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);

    // Set so curl_exec returns the result instead of outputting it.
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    // Get the response and close the channel.
    $response = curl_exec($ch);
    curl_close($ch);

    If $url points toward an HTTPS resource, you’re likely to encounter an error like the one below:
    Failed: Error Number: 60. Reason: SSL certificate problem, verify that the CA cert is OK. Details:
    error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

    The problem is that cURL has not been configured to trust the server’s HTTPS certificate. The concepts of certificates and PKI revolves around the trust of Certificate Authorities (CAs), and by default, cURL is setup to not trust any CAs, thus it won’t trust any web server’s certificate. So why don’t you have problems visiting HTTPs sites through your web browser? As it happens, the browser developers were nice enough to include a list of default CAs to trust, covering most situations, so as long as the website operator purchased a certificate from one of these CAs.
    The quick fix

    There are two ways to solve this problem. Firstly, we can simply configure cURL to accept any server(peer) certificate. This isn’t optimal from a security point of view, but if you’re not passing sensitive information back and forth, this is probably alright. Simply add the following line before calling curl_exec():
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

    This basically causes cURL to blindly accept any server certificate, without doing any verification as to which CA signed it, and whether or not that CA is trusted. If you’re at all concerned about the data you’re passing to or receiving from the server, you’ll want to enable this peer verification properly. Doing so is a bit more complicated.
    The proper fix

    The proper fix involves setting the CURLOPT_CAINFO parameter. This is used to point towards a CA certificate that cURL should trust. Thus, any server/peer certificates issued by this CA will also be trusted. In order to do this, we first need to get the CA certificate. In this example, I’ll be using the https://api.del.icio.us/ server as a reference.

    First, you’ll need to visit the URL with your web browser in order to grab the CA certificate. Then, (in Firefox) open up the security details for the site by double-clicking on the padlock icon in the lower right corner:



    Then click on “View Certificate”:



    Bring up the “Details” tab of the cerficates page, and select the certificate at the top of the hierarchy. This is the CA certificate.



    Then click “Export”, and save the CA certificate to your selected location, making sure to select the X.509 Certificate (PEM) as the save type/format.



    Now we need to modify the cURL setup to use this CA certificate, with CURLOPT_CAINFO set to point to where we saved the CA certificate file to.
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
    curl_setopt($ch, CURLOPT_CAINFO, getcwd() . "/CAcerts/BuiltinObjectToken-EquifaxSecureCA.crt");

    The other option I’ve included, CURLOPT_SSL_VERIFYHOST can be set to the following integer values:
    0: Don’t check the common name (CN) attribute
    1: Check that the common name attribute at least exists
    2: Check that the common name exists and that it matches the host name of the server

    If you have CURLOPT_SSL_VERIFYPEER set to false, then from a security perspective, it doesn’t really matter what you’ve set CURLOPT_SSL_VERIFYHOST to, since without peer certificate verification, the server could use any certificate, including a self-signed one that was guaranteed to have a CN that matched the server’s host name. So this setting is really only relevant if you’ve enabled certificate verification.

    This ensures that not just any server certificate will be trusted by your cURL session. For example, if an attacker were to somehow redirect traffic from api.delicious.com to their own server, the cURL session here would not properly initialize, since the attacker would not have access to a server certificate (i.e. would not have the private key) trusted by the CA we added. These steps effectively export the trusted CA from the web browser to the cURL configuration.
    More information

    If you have the CA certificate, but it is not in the PEM format (i.e. it is in a binary or DER format that isn’t Base64-encoded), you’ll need to use something like OpenSSL to convert it to the PEM format. The exact command differs depending on whether you’re converting from PKCS12 or DER format.

    There is a CURLOPT_CAPATH option that allows you to specify a directory that holds multiple CA certificates to trust. But it’s not as simple as dumping every single CA certificate in this directory. Instead, they CA certificates must be named properly, and the OpenSSL c_rehash utility can be used to properly setup this directory for use by cURL.

  • Как в php конвертировать BB коды в HTML

    Как в php конвертировать bb коды в html​С недавних пор, читатели моего блога могут комментировать статьи используя bb коды. До этого на сайте была собственная система парсинга комментариев. Она часто работала не корректно и имела кучу дыр. несколько раз пользователи блога демонстрировали мне, как легко на сайте можно разместить вредоносный JavaScript, осуществляя инъекцию. Поразмыслив, решил, что для моего проекта отлично подойдут bb коды. Для этого нашел библиотеку на сайте phpclasses, который github был наверно одним из основных источников готовых решений. 

    Класс с говорящим названием BBCode. Скачать его можно с моего сайта.

  • Как написать свой фреймворк на php. Модель. Урок 5

    Эта статья будет иметь более прикладной смысл, чем предыдущие. Мы создадим класс модели, который вы в принципе сможете использовать в своих проектах

    Для начала переименуем класс Model в ideal/classes/Model.php в Registry и файл назовем также ideal/classes/Registry.php При разработке можете скидывать на этот класс все, что связано с настройками, с запросами, и т.п.

    В местах его использования также все переименуем

    <?php
    class Registry{
    	private $data = array();
    	function __construct($data = array()) {
    		$this->data = $data;
    	}
    	function __get($name){
    		return isset($this->data[$name])?$this->data[$name]:null;
    	}
    	function __set($name,$value){
    		$this->data[$name] = $value;
    	}
    }

    в App.php

    $this->config = new Registry(array_merge($default_config, $custom_config));
    //...
    $this->uri = new Registry(Router::gi()->parse($_SERVER['REQUEST_URI']));

    и в application/models/user.php

    class User extends Registry{

    Теперь ничего нам не мешает создать новый класс ideal/classes/Model.php

    <?php
    class Model{
    	private $_data = null;
    	function __construct() {
    		$this->_data = new stdClass();
    	}
    	function __set($name, $value) {
    		$this->_data->$name = $value;
    	}
    	function __get($name) {
    		return property_exists($this->_data, $name) ? $this->_data->$name : null;
    	}
    }

    отличие от Registry пока лишь в том, что мы используем объект место ассоциативного массива.

    Теперь при обращении к полю экземпляра такой модели

    $model = new Model();
    $model->id = 5;

    вызывается магический метод __set и внутреннему объекту $data в поле $id записывается нужное значение.

    Зачем это делать? - спросите вы

  • Как написать свой фреймворк на php. Роутер и Шаблонизатор. Урок 3

    IDeal

    В предыдущих постах мы разработали минимальную структуру фреймворка. В этой статье, наведем немного лоска - добавим простенькую тему с bootstrap'ом, меню и подробнее рассмотрим работу шаблонизатора и роутера (маршрутизатора сайта). 

    Роутер

    В прошлой статье мы создали роутер, который используя логику регулярных выражений распознает входящую sef ссылку и направляет на нужный контроллер и его метод.

    Т.е. из такой строки

    /user/profile/12

    роутер делает массив

    array('controller'=>'user','action'=>'profile', 'id'=>15)

    Мы не стали в прошлый раз писать пример использования такого решения. Исправим ситуацию, но перед этим доработаем роутер.

    Перенесем массив правил роутера в конфигурационный файл фреймворка. Этот массив будут заполнять разработчики, которые будут писать сайты на нашем фреймворке. Поэтому он должен быть максимально доступен.

    ...
    'router' => array( 
    	'([a-z0-9+_\-]+)/([a-z0-9+_\-]+)/([0-9]+)' => '$controller/$action/$id',
    	'([a-z0-9+_\-]+)/([a-z0-9+_\-]+)' => '$controller/$action',
    	'([a-z0-9+_\-]+)(/)?' => '$controller',
    ),
    ...

    Кроме того вы можете видеть, что мы изменили правую часть массива.

  • Как написать свой фреймворк на php. Урок 2

    В прошлой статье мы разобрали структуру фреймворка, но не его реализацию. Для того чтобы фреймворк начал функционаровать, нам потребуется его доработать. Для начала подключим файл конфигурацию. Мы обозначили файл, как config.php, но никак его не использовали.

    По опыту разработки сразу оговорюсь, удобно использовать два файла конфигурации: первый для общих настроек - название сайта, адрес домена, время жизни куков, и второй для настроек подключения к БД. Это в первую очередь качается разработки на фреймворке. Так как для такой системы важно быстро развернуть ее на локальном компьютере и зачем перенести на сервер. При таком переносе, один из конфигов будет общим, а второй будет заполнен лишь единожды для каждого сервера. Поэтому определим два файла config.php и config.db.php

    Структура этих файлов должна быть как можно проще. Идеальный вариант - ini файлы. Но для них нужно писать отдельные парсеры и они доступны из вне. Поэтому не будем изобретать велосипед, а сделаем простой php ассоциативный массив с парами ключ-значение.

  • Как написать универсальный парсер сайтов за 1 час

    В аську постучал один из читателей этого блога, и заказал универсальный парсер сайтов. Парсер должен был уметь грабить произвольный сайт и выдирать из него всю текстовую информацию. Кроме того, он должен найти все ссылки на сайте и пройти по ним. У парсера должна быть настройка, ограничивающая число страниц, которое он парсит за один раз. Цена была небольшой, но и задание само по себе несложное. Итак, приступим

  • Как определить на php что страницу открыл поисковый бот

    Отсутствуя год заметил, что счетчик посещений некоторых страничек просто зашкаливает. Связано это, как выяснилось, с тем, что помимо реальных пользователей страничка генерируется и для поисковых ботов. Поэтому была нужна функция, которая бы определяла идет текущий запрос к странице от бота или от пользователя. Используя HTTP_USER_AGENT, можно узнать, если страница посещается ботом:

    function isBot(&$botname = ''){
    /* Эта функция будет проверять, является ли посетитель роботом поисковой системы */
    	$bots = array( 
    		'rambler','googlebot','aport','yahoo','msnbot','turtle','mail.ru','omsktele',
    		'yetibot','picsearch','sape.bot','sape_context','gigabot','snapbot','alexa.com',
    		'megadownload.net','askpeter.info','igde.ru','ask.com','qwartabot','yanga.co.uk',
    		'scoutjet','similarpages','oozbot','shrinktheweb.com','aboutusbot','followsite.com',
    		'dataparksearch','google-sitemaps','appEngine-google','feedfetcher-google',
    		'liveinternet.ru','xml-sitemaps.com','agama','metadatalabs.com','h1.hrn.ru',
    		'googlealert.com','seo-rus.com','yaDirectBot','yandeG','yandex',
    		'yandexSomething','Copyscape.com','AdsBot-Google','domaintools.com',
    		'Nigma.ru','bing.com','dotnetdotcom'
    	);
    	foreach($bots as $bot)
    		if(stripos($_SERVER['HTTP_USER_AGENT'], $bot) !== false){
    			$botname = $bot;
    			return true;
    		}
    	return false;
    }

    Использовать очень просто:

    if( !isBot() )$hits=$hits+1;// накручиваем счетчик если запрос не от бота
    // или так
    $bname = '';
    if( isBot($bname) ) echo 'На сайте сейчас '.$bname;

     

  • Как ускорить Denwer

      Не знаю как Вы, но я отлаживаю сайты на локальном сервере. Мне так удобнее, да и быстрый интернет не всегда есть под рукой. В качестве сервера я использую Denwer. Конечно если вдоваться в детали, то это не совсем сервер, это пакет программ для легкого разворачивания web сервера на своем компьютере. Пока у меня был GPRS, и я не знал радостей широкополосного доступа, скорость работы этого пакета меня вполне устраивала. Однако времена меняются, и теперь на хорошем интернете сайт на удаленном сервере работает гораздо отзывчивее чем на локальном Denwer'е. Непорядок, задержек быть не должно, тем более что железо не самое последнее, и в принципе сверх нагруженных базами/ООП/фреймворками проектов я не пишу.
       Я более чем убежден, что файл с <?php echo 'Hello world!!!'; должен обрабатываться, практически мгновенно, а кнопочка обновления не должна быть заметна глазу. Для того чтобы Denwer работал так, как нужно, необходимо принять ряд мер по его акселерации. Посмотрим, что же можно сделать.

  • Класс для обработки, добавления эффектов и обрезки изображений на PHP

    В php для работы с изображениями есть замечательная библиотека GD2. С помощью нее можно делать с изображениями различные манипуляции такие, как негатив, оттенки серого, ватермарка, яркость, контраст и др. Все это можно делать, но в самой библиотеке нет API для этого, всю обработку нужно описывать самому. Однако все подобные велосипеды давно написаны и один из лучших на этом поле является класс tulipIP. 

    В этой статье я расскажу, как работать с данным пакетом на примерах. Для начала небольшая демонстрация работы. До:

    .Великолепная Элизабет Душку до обработки беблиотекой tulipip php

    И после

    Великолепная Элизабет Душку после обработки беблиотекой tulipip php

  • Кросс доменная ajax загрузка файла на сервер

    Я пытаюсь создать cross domain AJAX форму загрузки и решить несколько вопросов. Я буду использовать Ajax Upload - наиболее удобный ajax загрузчик. Этот загрузчик прекрасно работает на одном домене и очень прост в настройке.

    Примечание переводчика: Статья незавершенная, готового решения в ней нет, решил перевести ее потому-что часть кода использованного в ней мне помогло, однако повторюсь, что это не урок.

  • Многопоточные парсеры

    Парсер, парсер, парсер

    Который год пишу парсеры, и знать ничего не знал про многопоточность. В продвинутых компилируемых языках типа C++, Delphi и даже в старом добром, интерпретируемом Perl, многопоточность одна из главных составляющих. Никто бы не стал пользоваться приложением, если бы его окно зависало во время больших вычислений. Программистам PHP повезло меньше. Этот язык вырос из шаблонизатора, и каким бы он не был удобным по сути шаблонизатором и остается. Многопоточности в нем попросту НЕТ. Наверно поэтому  большинством уже упомянутых сиплюсоидов и делфистов считают PHP недоязыком.

    Однако порой наступает случай, когда запуск одного и того же PHP скрипта, одновременно с разными параметрами, здорово увеличивает производительность. И многопоточные парсеры тому пример. Однако стоит опять упомянуть, что потоков в языке нет, и все что будет изложено ниже, это всего лишь псевдо мультипоточность. Все дело в том, что запросов к серверу донору можно посылать хоть сколько, лишь бы канал работал. А потом, в цикле основного потока, проверять какой из запросов отработал. Вот и все чудеса. Обработка данных происходит также в одном потоке, а вот их прием и пересылка в нескольких. Это значит, что  в момент пока запрос №2 еще не завершился, а №1  уже вернул результат, мы можем обрабатывать его труды.

  • Несколько баз данных в моделях Laravel

    При разработке CRM системы, довольно часто, основной сайт компании, лежит где-то рядом. И обычно использует другую базу данных. Распространенная задача - выдернуть какие-то данные из этой базы внутри CRM, используя модели. Как это сделать? Как использовать 2 или более подключения для ActiveRecord в Laravel

    Этот пост о том как использовать несколько баз данных, а не про балансировку нагрузки или менеджер переключений между базами

  • Оповещение пользователя на сайте

    В web-проектах, важную роль играет обратная связь пользователя и сайта. Так уж заведено изначально, что пользователь теряет всякую связь с сайтом после того, как закрывает вкладку с ним. Что бы пользователь еще раз зашел на сайт, его нужно туда привлечь.

    В обычных блогах или форумах используют для этого e-mail рассылку. Это самый дешевый вид рассылки. В php есть даже специальная функция mail. Но пользоваться ей, в серьезных проектах, не рекомендуется. На это есть ряд причин. Первая из них это надежность, а точнее ненадежность. Функция не сама посылает письмо, а отправляет его на внутренний mail сервер. А уже он занимается пересылкой. Сама же функция возвращает только статус того, ушла ли операция отправки на сервер удачно. Отправлено ли письмо она узнать не может.

  • Парсер для заполнения Joomla сайта или программное добавление статьи в Joomla через php

    Продолжая тему парсеров. Одна из самых распространенных задач, которые я постоянно встречаю - заполнить Joomla сайт на основе другого сайта. Полный переезд, обычно с более старой версии Joomla, но быть может и с другой CMS, не важно.

    Обычно, проще в ручную скопировать все тексты с сайта, чем писать отдельный граббер под это дело. Когда  же дело касается нескольких сотен статей, мой внутренний прагматик запрещает мне работать руками и в дело вступает мозг.

    В идеале парсер должен съедать лишь одну страницу сайта на входе и обходить все найденные страницы сам. В статье Как написать универсальный парсер сайтов за 1 час я уже рассказывал, как это сделать. Когда дело касается переезда на Joomla, то необходимо точно воссоздать структуру сайта донора, посему немного упростим задачу, и будем парсить лишь заданный список ссылок, который будет определенным образом привязан к конкретному разделу из сайта источника. А этот самый раздел на нашем сайте, создадим руками.

    Т.е. в этой статье мы автоматизируем рутинные операции копипаста: копирование текста, создание статьи в материалах, создание ссылки на статью в меню.

    К этим трем операциям можно еще добавить - автоматическое создание разделов сайта, на основе сайта донора. Однако, эту задачу я оставлю вам. Она не сложная, поверьте. Пишите в комментариях, как вы ее решаете.

  • Пишем собственную систему шаблонизатора на php

    Модель Вид Контроллер, или попросту MVC - наверно самый популярный паттерн разработки web-сайтов. Грубо говоря Модель - содержит, Вид - показывает, а Контроллер -  все это дело координирует..

    В этой статье я расскажу про Вид. А точнее самалепный шаблонизатор. Почему я вновь пишу велосипед? - просите Вы. Я отвечу: PHP сам по себе является шаблонизатором, и прикручивать что-то стороннее к его работе, вот это уже ненормально. Мы же всего-лишь слегка облегчим работу верстальщику.

  • Простейший синонимайзер на php

    При написании одной доски объявлений, заказчик, как водиться, попросил написать парсер объявлений с известных досок. 

    На современном уровне развития антиспам систем, сграбить новые объявления не так и просто с задачей я справился. Пришлось применить парочку хитрых приемов с COM объектом Интернет Эксплорера. Но сейчас не про это.

    Грош цена такому тексту для поисковых систем. Ведь текст не уникальный, а значит надо сделать так, чтобы он стал уникальным.

  • Распаковка zip архивов на сервере через PHP

    Веб-дизайнеры и разработчики знают, что сжатие файлов в один zip архив, необходимая мера, когда дело доходит до загрузки огромного количества файлов на сервер, что означает необходимость распаковать файл после его загрузки.

    Распаковка файлов на стороне сервера при помощи нативных средств php

  • Создание компонента Joomla с нуля. Часть 1

    Создание компонента в Joomla надо начинать с создания XML файла с названием расширения. Если говорить на чистоту, то это не обязательный файл, для работы компонента. Если создать папку с названием компонента и прописать его в табличке jml_components в базе, то компонент отработает только при наличии другого php файла с идентичным названием. Однако, про php файл я расскажу в другой статье. Здесь мы сделаем лишь XML заготовку. Приступим.