Получение котировок валют с сайта ЦБР (пример использования SimpleXML)

На одном из сайтов понадобились котировки валют.. Получился такой замечательный хелпер :)
Кстати, хороший пример использования SimpleXML, хватит уже изобретать всякие xml2array - всё придумано до нас!

  1. <?php
  2. /**
  3.  * @descr Helper for getting currency values from cbr.ru
  4.  * @param (string) $code Code of currency you need
  5.  * @param (string) [$date] Date of day you need (format: "d/m/Y")
  6.  * @param (string) [$template] Template for html-making where ?c will be currency charcode, ?n will be nominal and ?v will be currency value in rubbles
  7. **/
  8. function getCbrCurrency( $code, $date = '', $template = '' ) {
  9. $date = $date
  10. ? $date
  11. : date( "d/m/Y" );
  12.  
  13. if ( strlen( $GLOBALS['___XML'][$date] ) > 50 || $GLOBALS['___XML'][$date] = file_get_contents( "http://www.cbr.ru/scripts/XML_daily.asp?date_req=$date" ) ) {
  14. $xml = simplexml_load_string( $GLOBALS['___XML'][$date] );
  15. foreach ( $xml->Valute as $o ) {
  16. if ( $o->CharCode == $code ) {
  17. return array(
  18. 'CharCode' => (string)$o->CharCode[0],
  19. 'Nominal' => (string)$o->Nominal[0],
  20. 'Value' => (string)$o->Value[0],
  21. 'html' => $template
  22. ? str_replace(
  23. array(
  24. '?c',
  25. '?n',
  26. '?v'
  27. ),
  28. array(
  29. (string)$o->CharCode[0],
  30. (string)$o->Nominal[0],
  31. (string)$o->Value[0]
  32. ),
  33. $template
  34. )
  35. : '',
  36. );
  37. }
  38. }
  39. }
  40. return false;
  41. }
  42.  
  43. print_r( getCbrCurrency ( 'USD', '', '<span>?c:</span> ?v р.' ) );

Полезная функция "service" для bash-а

Столкнулся с проблемой во FreeBSD - нет "service name action" :(
Написано за 2-е минуты :)
  1. function service()
  2. {
  3. if [ $# -ne 2 ] ; then
  4. echo "usage: service name action"
  5. return 1
  6. else
  7. if [ -f /etc/rc.d/$1 ] ; then
  8. . /etc/rc.d/$1 $2
  9. else
  10. if [ -f /usr/local/etc/rc.d/$1 ] ; then
  11. . /usr/local/etc/rc.d/$1 $2
  12. else
  13. echo "service $1 not found"
  14. fi
  15. fi
  16. fi
  17. }
  18.  

Правильный парсер html

Как вы делаете парсер (скрипт, который выдёргивает некую информацию с некой страницы)? Вставляете кучу strpos, preg_match и прочее "прицеливание"?

Предлагаю вашему вниманию абсолютно другой способ:  Simple HTML DOM Parser - скрипт, который позволяет работать с DOM документа, а конекретнее, использовать css-селекторы для поиска нужных элементов.

Маленький пример:

  1. <?php
  2. // загружаем библиотеку
  3. require './simplehtmldom/simple_html_dom.php';
  4.  
  5. // будем парсить гугл :)
  6. $d = file_get_html ( 'http://www.google.com/search?hl=en&q=%D1%8B%D1%80%D0%BE%D0%BB%D0%B2%D0%B0&aq=f&oq=&aqi=' );
  7.  
  8. // селектор результатов
  9. foreach($d->find('li.g') as $snippet) {
  10. $r = array();
  11. $r['link'] = $snippet->find( 'h3.r a', 0 )->href; // ссылка
  12. $r['title'] = $snippet->find( 'h3.r', 0 )->plaintext; // заголовок
  13. // убираем лишнее
  14. $snippet->find( 'div.s cite', 0 )->innertext = '';
  15. $snippet->find( 'div.s span', 0 )->innertext = '';
  16. $r['snippet'] = $snippet->find( 'div.s', 0 )->plaintext; // сниппет
  17. $rez[] = $r;
  18. }
  19.  
  20. // показываем..
  21. print_r( $rez );

Вот так легко и элегантно можно парсить сниппеты гугла :) Кстати, библиотеку лучше качать из транка svn - там версия выше + мануал обширнее.

Как выполнять функции прямо в heredoc и double-quoted строках

Многие сталкивались с этой проблемой.. надеюсь мой способ поможет кому-то кроме меня выполнять функции, выражения и многое другое прямо в heredoc или строке в двойных кавычках. Иногда очень полезная штуковина :)

  1. <?php
  2. // Функция-хак
  3. $__eval = create_function( '$c', 'return $c' );
  4.  
  5. // Проверяем..
  6. define( 'constant_str', 'smth string' );
  7. define( 'constant_int', 8 );
  8.  
  9. $x = 6;
  10. $y = 2;
  11.  
  12. function z( $x, $y ) { return $x * $y; }
  13.  
  14. // Примеры использования
  15. // Синтаксис: {$__eval( [expressions|variables|constants|functions|object->methods|etc] )}
  16. echo "1st: {$__eval(4+5)} text\r"; // выводит '1st: 9 text'
  17. echo "2nd: {$__eval(constant_str)} and text\r"; // выводит '2nd: smth string and text'
  18.  
  19. echo <<<HEREDOC
  20. 3rd: {$__eval( z($x, $y) + constant_int / 2)} and text again
  21. HEREDOC;
  22. // выводит '3rd: 20 and text again'

Чем залить большие большие дампы mysql на сервер - BigDump

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

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

Поэтому, необходим скрипт, который сам делил бы большой дамп на несколько частей и частями его заливал. Такой скрипт есть :) называется он BigDump. Очень прост в использовании: заливаете скрипт, в ту же папку дамп, прописываете в скрипте данные для соединения с mysql и всё, считайте дело сделано :)

Проверял на дампах больше 1 ГБ, работает как часы. Один нюанс - иногда приходится также настроить размеры запросов, на которые делит скрипт дамп.. но это не проблема.

Расширенный file_get_contents или про cURL можно забыть

Меня всегда озадачивал вопрос - почему все так и норовят везде и всюду использовать cURL, восхваляя его? Почему просто не использовать встроенные функции вместо сторонней библиотеки, которая, к тому же, ещё и установлена не у всех? Итак, открываем завесу тьмы и развеиваем бытующее мнение о "несамостоятельности" php..

В php существует замечательная вещь - контекст потоков. Эти контексты содержат в себе наверно весь функционал cURL (список врапперов/протоколов с описаниями) - ещё ни одна задача не заставила меня использовать cURL.

Чтобы не остаться голословным, маленький пример реализации POST запроса из мануала на встроенных функциях:

  1. <?php
  2.  
  3. $postdata = http_build_query(
  4. array(
  5. 'var1' => 'some content',
  6. 'var2' => 'doh'
  7. )
  8. );
  9.  
  10. $opts = array('http' =>
  11. array(
  12. 'method' => 'POST',
  13. 'header' => 'Content-type: application/x-www-form-urlencoded',
  14. 'content' => $postdata
  15. )
  16. );
  17.  
  18. $context = stream_context_create($opts);
  19.  
  20. $result = file_get_contents('http://example.com/submit.php', false, $context);