
Быстрый поиск
Введите фрагмент названия статьи для поиска
Скрипт для проверки местонахождения и статуса посылок
21.06.2012 | Категория: Web-мастеру и не только | Автор: ManHunter
Для отслеживания почтовых отправлений на сайте Почты России сделана специальная страничка. Когда вы ждете одну-две посылки, то можно воспользоваться ей. Для автоматического отслеживания нескольких посылок также есть специальные сервисы, они самостоятельно опрашивают сайт Почты и сохраняют полученные результаты у себя в базе. Но для отслеживания большого числа посылок, как правило, на подобных сервисах требуется переходить на платные тарифы. Когда я столкнулся с такой ситуацией, то вариант с оплатой, естественно, сразу же был отвергнут как неприемлемый. Проще было самому написать некое подобие такого сервиса, но заточенного под свои нужды. Вот что у меня получилось:Code (PHP) : Убрать нумерацию
- <?
- // Массив с трек-номерами посылок
- // заполняйте его по аналогии трек-номерами своих посылок
- $codes=array('RA111111111CN', 'RA222222222CN', 'RA33333333CN');
- // Массив с результатами отслеживания
- $status=array();
- $link='http://www.russianpost.ru/resp_engine.aspx?Path='.
- 'rp/servise/ru/home/postuslug/trackingpo';
- foreach ($codes as $code) {
- // Подготовка запроса cURL
- $ch = curl_init();
- curl_setopt($ch, CURLOPT_URL, $link);
- curl_setopt($ch, CURLOPT_HEADER, 0);
- curl_setopt($ch, CURLOPT_POST, 1);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
- curl_setopt($ch, CURLOPT_POSTFIELDS, 'entryBarCode='.$code.
- '&BarCode='.$code.'&searchsign=1');
- // Отправка POST-запроса на сервер и получение страницы результата
- $grab=curl_exec($ch);
- if (eregi('value="([0-9]+)"',$grab,$pocket)) {
- // установка URL и других необходимых параметров
- curl_setopt($ch, CURLOPT_URL, $link);
- curl_setopt($ch, CURLOPT_HEADER, 1);
- curl_setopt($ch, CURLOPT_POST, 1);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
- curl_setopt($ch, CURLOPT_POSTFIELDS, 'key='.$pocket[1]);
- // загрузка страницы
- $grab=curl_exec($ch);
- // установка URL и других необходимых параметров
- curl_setopt($ch, CURLOPT_URL, $link);
- curl_setopt($ch, CURLOPT_HEADER, 1);
- curl_setopt($ch, CURLOPT_POST, 1);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
- curl_setopt($ch, CURLOPT_POSTFIELDS, 'entryBarCode='.$code.
- '&BarCode='.$code.'&searchsign=1');
- // загрузка страницы
- $grab=curl_exec($ch);
- }
- // Фикс кодировки полученной страницы
- $grab=mb_convert_encoding($grab, 'Windows-1251', 'UTF-8');
- // Небольшой фикс для упрощения парсинга страницы
- $grab=eregi_replace('<a href=javascript\:Wind\([^\(]*\)>','',$grab);
- preg_match_all('/<tr align="center"><td>([^<]+)<\/td><td>([^<]+)'.
- '<\/td><td>[^<]*<\/td><td>([^<]+)<\/td><td>([^<]*)<\/td>/',$grab,$matches);
- $st=array();
- $st['code']=$code;
- // Если получен какой-то результат
- if (count($matches[1])) {
- // Последнее действие
- if ($matches[4][count($matches[1])-1]) {
- $st['action']=$matches[4][count($matches[1])-1];
- }
- else {
- $st['action']=$matches[1][count($matches[1])-1];
- }
- // Дата последнего действия
- $st['date']=$matches[2][count($matches[1])-1];
- // Местонахождение посылки
- $st['where']=$matches[3][count($matches[1])-1];
- }
- // Ошибка на сервере или статус посылки еще не определен
- else {
- $st['action']='Неизвестно';
- $st['date']='--';
- $st['where']='--';
- }
- // Записать результат в массив
- $status[]=$st;
- curl_close($ch);
- }
- // Теперь в массиве $status содержится информация по всем посылкам
- var_dump($status);
- ?>
Читать статью целиком »
Просмотров: 11020 | Комментариев: 20
Функция для отображения размера файла
21.05.2012 | Категория: Web-мастеру и не только | Автор: ManHunter
Размер файлов в PHP измеряется в байтах, но числа из большого количества цифр для восприятия очень неудобны. На мой взгляд гораздо нагляднее, если размер больших файлов будет отображаться в килобайтах, мегабайтах и так далее. Для этого я нарисовал вот такую вспомогательную функцию:Code (PHP) : Убрать нумерацию
- function bytes2words($size) {
- for($i=0; $i<count($st=array('Кб','Мб','Гб')); $i++) {
- if (($size/=1024)<1024) { $i++; break; }
- }
- return round($size,2).' '.$st[($i-1)];
- }
Code (PHP) : Убрать нумерацию
- echo bytes2words(1000).'<br>'; // 0.98 Кб
- echo bytes2words(10000).'<br>'; // 9.77 Кб
- echo bytes2words(100000).'<br>'; // 97.66 Кб
- echo bytes2words(1000000).'<br>'; // 976.56 Кб
- echo bytes2words(10000000).'<br>'; // 9.54 Мб
- echo bytes2words(100000000).'<br>'; // 95.37 Мб
- echo bytes2words(1000000000).'<br>'; // 953.67 Мб
- echo bytes2words(10000000000).'<br>'; // 9.31 Гб
- echo bytes2words(100000000000).'<br>'; // 93.13 Гб
- echo bytes2words(1000000000000).'<br>'; // 931.32 Гб
- echo bytes2words(10000000000000).'<br>'; // 9313.23 Гб
- echo bytes2words(100000000000000).'<br>'; // 93132.26 Гб
Code (PHP) : Убрать нумерацию
- echo bytes2words(100000000000).'<br>'; // 93.13 Гб
- echo bytes2words(1000000000000).'<br>'; // 931.32 Гб
- echo bytes2words(10000000000000).'<br>'; // 9.09 Тб
- echo bytes2words(100000000000000).'<br>'; // 90.95 Тб
Просмотров: 4871 | Комментариев: 4
Подсветка синтаксиса MySQL-запросов
07.04.2012 | Категория: Web-мастеру и не только | Автор: ManHunter
При выводе диагностики в своих рабочих проектах я использую вот такую функцию для подсветки синтаксиса MySQL-запросов. Она преобразует текст запроса, делая все служебные слова языка заглавными буквами и подсвечивает их цветом, а также выделяет различными цветами числовые значения и скобки. Такая подсветка позволяет сразу же увидеть синтаксические ошибки, да и вообще повышает наглядность сообщений при отладке скриптов.Code (PHP) : Убрать нумерацию
- //-------------------------------------------------------------------
- // Функция подсветки синтаксиса MySQL-запроса
- // (C) ManHunter / PCL
- // http://www.manhunter.ru
- //-------------------------------------------------------------------
- function mysql_debug($query) {
- $tmp=htmlspecialchars($query);
- $tmp=str_replace("\r",'',$tmp);
- $tmp=trim(str_replace("\n","\r\n",$tmp))."\r\n";
- $quote_list_text=array();
- $quote_list_symbols=array();
- $k=0;
- $quotes=Array();
- // Обработать экранированные кавычки
- preg_match_all("/\\\'|\\\"/is", $tmp, $quotes);
- array_unique($quotes);
- if (count($quotes)) {
- foreach($quotes[0] as $i) {
- $k++;
- $quote_list_symbols[$k]=$i;
- $tmp=str_replace($i, '<symbol'.$k.'>', $tmp);
- }
- }
- $matches=Array(
- "/("|'|`)(.*?)(\\1)/is", // текст в кавычках
- "/\/\*.*?\*\//s", // текст комментария
- "/ \-\-.*\x0D\x0A/", // текст ' --' комментария
- "/ #.*\x0D\x0A/", // текст ' #' комментария
- );
- // Обработать текст
- foreach($matches as $match) {
- // Обработать текст
- $found=array();
- preg_match_all($match, $tmp, $found);
- $quotes=(array)$found[0];
- array_unique($quotes);
- if (count($quotes)) {
- foreach($quotes as $i) {
- $k++;
- $quote_list_text[$k]=$i;
- $tmp=str_replace($i, '<text'.$k.'>', $tmp);
- }
- }
- }
- // Служебные слова MySQL
- $keywords=Array(
- "avg", "as", "auto_increment", "and", "analyze", "alter",
- "asc", "all", "after", "add", "action", "against",
- "aes_encrypt", "aes_decrypt", "ascii", "abs", "acos",
- "asin", "atan", "authors", "between", "btree", "backup",
- "by", "binary", "before", "binlog", "benchmark", "blob",
- "bigint", "bit_count", "bit_or", "bit_and", "bin",
- "bit_length", "both", "create", "count", "comment",
- "check", "char", "concat", "cipher", "changed", "column",
- "columns", "change", "constraint", "cascade", "checksum",
- "cross", "close", "concurrent", "commit", "curdate",
- "current_date", "curtime", "current_time",
- "current_timestamp", "cast", "convert", "connection_id",
- "coalesce", "case", "conv", "concat_ws", "char_length",
- "character_length", "ceiling", "cos", "cot", "crc32",
- "compress", "delete", "drop", "default", "distinct",
- "decimal", "date", "describe", "data", "desc",
- "dayofmonth", "date_add", "database", "databases",
- "double", "duplicate", "disable", "datetime", "dumpfile",
- "distinctrow", "delayed", "dayofweek", "dayofyear",
- "dayname", "day_minute", "date_format", "date_sub",
- "decode", "des_encrypt", "des_decrypt", "degrees",
- "decompress", "dec", "engine", "explain", "enum",
- "escaped", "execute", "extended", "errors", "exists",
- "enable", "enclosed", "extract", "encrypt", "encode",
- "elt", "export_set", "escape", "exp", "end", "from",
- "float", "flush", "fields", "file", "for", "fast", "full",
- "fulltext", "first", "foreign", "force", "from_days",
- "from_unixtime", "format", "found_rows", "floor", "field",
- "find_in_set", "group", "grant", "grants", "global",
- "get_lock", "greatest", "having", "high_priority",
- "handler", "hour", "hex", "insert", "into", "inner",
- "int", "ifnull", "if", "isnull", "in", "infile", "is",
- "interval", "ignore", "identified", "index", "issuer",
- "integer", "is_free_lock", "inet_ntoa", "inet_aton",
- "instr", "join", "kill", "key", "keys", "left", "load",
- "local", "limit", "like", "lock", "lpad", "last_insert_id",
- "logs", "length", "longblob", "longtext", "last", "lines",
- "low_priority", "locate", "ltrim", "leading", "lcase",
- "lower", "load_file", "ln", "log", "least", "month", "mod",
- "max", "min", "mediumint", "medium", "master", "modify",
- "mediumblob", "mediumtext", "match", "mode", "monthname",
- "mid", "minute", "master_pos_wait", "make_set", "null",
- "not", "now", "none", "new", "numeric", "no", "natural",
- "next", "nullif", "national", "nchar", "on", "or",
- "optimize", "order", "optionally", "option", "outfile",
- "open", "offset", "outer", "old_password", "ord", "oct",
- "octet_length", "primary", "password", "privileges",
- "process", "processlist", "purge", "partial", "procedure",
- "prev", "period_add", "period_diff", "position", "pow",
- "power", "pi", "quick", "quarter", "quote", "right",
- "repair", "restore", "reset", "regexp", "references",
- "replace", "revoke", "reload", "require", "replication",
- "read", "rand", "rename", "real", "restrict",
- "release_lock", "rpad", "rtrim", "repeat", "reverse",
- "rlike", "round", "radians", "rollup", "select", "sum",
- "set", "show", "substring", "smallint", "super", "subject",
- "status", "slave", "session", "start", "share",
- "straight_join", "sql_small_result", "sql_big_result",
- "sql_buffer_result", "sql_cache", "sql_no_cache",
- "sql_calc_found_rows", "second", "sysdate", "sec_to_time",
- "system_user", "session_user", "substring_index", "std",
- "stddev", "soundex", "space", "strcmp", "sign", "sqrt",
- "sin", "straight", "sleep", "text", "truncate", "table",
- "tinyint", "tables", "to_days", "temporary", "terminated",
- "to", "types", "time", "timestamp", "tinytext",
- "tinyblob", "transaction", "time_format", "time_to_sec",
- "trim", "trailing", "tan", "then", "update", "union",
- "using", "unsigned", "unlock", "usage", "use_frm",
- "unix_timestamp", "unique", "use", "user", "ucase",
- "upper", "uuid", "values", "varchar", "variables",
- "version", "variance", "varying", "where", "with",
- "warnings", "write", "weekday", "week", "when", "xor",
- "year", "yearweek", "year_month", "zerofill");
- $replace=Array();
- foreach($keywords as $keyword) {
- $replace[]='/\b'.$keyword.'\b/ie';
- }
- // Выделить служебные слова в тексте запроса
- $tmp=preg_replace($replace,
- '"<b style=\"color:#0000FF\">".strtoupper("$0")."</b>"',$tmp);
- // Выделить числовые значения в тексте запроса
- $tmp=preg_replace('/\b([\.0-9]+)\b/',
- '<b style="color:#008000">\1</b>',$tmp);
- // Выделить скобки в тексте запроса
- $tmp=preg_replace('/([\(\)])/',
- '<b style="color:#FF0000">\1</b>',$tmp);
- // Вернуть обратно строки в кавычках
- if (count($quote_list_text)) {
- $quote_list_text=array_reverse($quote_list_text, true);
- foreach($quote_list_text as $k=>$i) {
- $tmp=str_replace('<text'.$k.'>',
- '<span style="color:#777;">'.$i.'</span>', $tmp);
- }
- }
- // Вернуть обратно экранированные символы
- if (count($quote_list_symbols)) {
- $quote_list_symbols=array_reverse($quote_list_symbols, true);
- foreach($quote_list_symbols as $k=>$i) {
- $tmp=str_replace('<symbol'.$k.'>', $i, $tmp);
- }
- }
- // Вернуть подсвеченный текст запроса
- // Если не надо расставлять переносы, то уберите nl2br
- return nl2br(trim($tmp));
- }
Читать статью целиком »
Просмотров: 5065 | Комментариев: 7
Кэширование на PHP
02.03.2012 | Категория: Web-мастеру и не только | Автор: ManHunter
Кэширование данных - это особая технология, направленная на снижение нагрузки на сервер. Суть ее заключается в том, что динамический контент, выбранные из базы данные или данные, получаемые из сторонних источников, сохраняются на диске в виде обычного текстового файла или в памяти вашего сервера. Когда они потребуются снова, то уже нет необходимости опять выполнять тяжелый запрос к базе, обращаться к стороннему серверу или заново парсить шаблон страницы, достаточно просто прочитать эти данные из ранее сохраненного файла или из памяти. Такой подход позволяет значительно ускорить генерацию страниц и тем самым ускорить загрузку сайта, что немаловажно на нагруженных проектах. Актуальность закэшированных данных устанавливается параметром "жизни кэша", то есть интервалом времени от момента сохранения данных до момента, когда их требуется обновить. "Время жизни" определяется для каждого типа данных индивидуально. Так, например, текст статьи может больше никогда не меняться после опубликования, поэтому ее закэшированный вариант можно также никогда не обновлять, кэш с комментариями может обновляться по мере добавления комментариев, данные пузомерок Google PR и Яндекс тИЦ достаточно обновлять раз в сутки, а картинку счетчика посещений желательно перерисовывать с интервалом не реже 10 минут.Сейчас мы попробуем написать свой модуль для работы с кэшем, основанный на файлах, чтобы понять как это все работает. Функции будут очень простые:
Code (PHP) : Убрать нумерацию
- // Определить папку для хранения кэшированных данных
- define ('CACHE_DIR',dirname(__FILE__).'/cache');
- // Запись данных в кэш
- function save_cache($file, $data) {
- if ($f=fopen(CACHE_DIR.'/'.$file,'w')) {
- fwrite($f,serialize($data));
- fclose($f);
- return true;
- }
- else {
- return false;
- }
- }
Читать статью целиком »
Просмотров: 6757 | Комментариев: 11
Отправка файла на сервер с помощью сокетов
02.02.2012 | Категория: Web-мастеру и не только | Автор: ManHunter
Иногда при разработке проектов возникает задача отправки данных на другие серверы. В случае текстовых данных или небольших объемов бинарных данных можно ограничиться POST- или GET-запросами. Этот способ никаких сложностей не представляет и здесь описываться не будет. А как быть, если на сторонний сервер требуется передать не только данные, но и файлы? Например, вы загружаете картинки через форму на своем сервере, но фактически храните их на каком-нибудь другом. В этом случае нам надо полностью проэмулировать работу браузера, а именно его обмен данными с удаленным сервером, как будто бы пользователь заполнил и отправил форму с web-страницы. Предположим, что для загрузки файлов на сервер используется следующая форма:Code (HTML) : Убрать нумерацию
- <form action="/uploader.php" method="post" enctype="multipart/form-data">
- Выберите файл: <input type="file" name="my_file"><br>
- Описание: <input type="text" name="ext_field_1"><br>
- <input type="submit" value="Загрузить">
- </form>
Каждое текстовое поле в теле запросе кодируется следующим образом:
--boundary
Content-Disposition: form-data; name="имя_поля_в_форме"
значение поляФайлы при передаче кодируются несколько иначе:
--boundary
Content-Disposition: form-data; name="имя_поля" filename="имя_файла"
Content-Type: mime-тип файла
двоичное содержимое файлаКак узнать mime-тип файла по его расширению, написано в этой статье. В заголовках запроса также обязательно должны присутствовать данные об общем размере тела запроса, а именно длина всех кодированных полей формы. Эта информация передается заголовком "Content-Length: NNNN". То есть сперва в вашем обработчике формируется тело запроса, а только после него заголовок.
Читать статью целиком »
Просмотров: 12541 | Комментариев: 12


