• 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);
    ?>

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

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

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

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

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

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

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

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

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

    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 нет аналога Javascript-конструкции (function() {})(); т.е. самовызов анонимной функции. Но его можно эмулировать, к примеру так: 

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

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

  • Представляю Вашему вниманию класс для пакетной обработки файлов 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' - по умолчанию, задаем и высоту и ширину, если входящее изображение вертикальное то размеры тумбика расчитываются так, чтобы все изображение влезло в заданные пределы.

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

  • Получить реальный 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';
    }

     

     

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

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

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

    • RSS 1.0 
    • RSS 2.0
    • ATOM 1.0

     

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

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

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

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