Категория архива: php

Что-то забросил я бложек. Надо исправлять.
.

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

Выбор на источник музыки тут же пал на ВКонтакте. Где ещё можно найти столько музыки да ещё и бесплатно?
.

Тут же был написан небольшой скрипт на php, который вытягивает ссылки на треки и аккуратно кладёт их в файл, из которого их можно скачать любым удобным даунлоад менеджером.
(далее…)

Сен, 30 Теги: , , ,
php | 3 комментария

Давно я не писал про php.

.

Так вот. Понадобилось мне ограничить количество замен производимых функцией str_replace.

.

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

.

Немного погуглив я вернулся к документации и в комментариях обнуружил нужный мне велосипед:

< ?php
function getSingleReplaceCombinations($replace, $with, $inHaystack)
{
    $splits = explode($replace, $inHaystack);
    $result = array();
    for ($i = 1, $ix = count($splits); $i < $ix; ++$i) {
        $previous = array_slice($splits, 0, $i);
        $next     = array_slice($splits, $i);
 
        $combine  = array_pop($previous) . $with . array_shift($next);
        $result[] = implode($replace, array_merge($previous, array($combine), $next));
    }
    return $result;
}
var_dump(getSingleReplaceCombinations("a", "x", "aba")); // result as mentioned above
?>

На выходе функция отдаёт массив со всеми возможными заменами.
Но, мне ведь нужна только одна замена, это решилось добавлением break в конце цикла:
(далее…)

Янв, 8 Теги: ,
php | 2 комментария

Неожиданная проблема возникла при переезде на другой хостинг.
WordPress после включения ЧПУ(permalinks) показывал только 404-ю ошибку, причём, даже на главной.

За неделю были выкурены все конфиги апача и php, но решение найдено не было и пришлось шаг за шагом разбирать что же там делает вордпресс, и почему отдаёт ошибку.

.

В итоге, зацепился за то, что параметры home и siteurl после установки нового вордпресса выглядят так: «http://site.ruhttp://site.ru», когда должны быть «http://site.ru».

.

Ещё немого поисков, и оказывается, что за формирование этого параметра отвечает функция «wp_guess_url()«, которая находится в файле «wp-includes/functions.php«.

.

Самая интересная строка в ней:

$url = preg_replace('|/wp-admin/.*|i', '', $schema . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);

Собственно, всё отлично и должно работать. Но посмотрев что возвращает каждый из параметров оказалось, что REQUEST_URI отдаёт полный путь вместе с доменом, т.е. выглядит примерно так: «http://site.ru/some_path», когда в документации написанно, что должен быть путь без домена: «/some_path»!

.

Желания искать причину бага уже не было(да и гугл выдаёт всего пару случаев, без решения) был быстро написан простой костыль, состоящий из двух файлов: .htaccess и req_url.php.
.htaccess:

php_value auto_prepend_file /full/path/req_url.php

.

req_url.php:

<?php
$_SERVER['REQUEST_URI']=str_replace("http://".$_SERVER["HTTP_HOST"],"",$_SERVER['REQUEST_URI']);
$_SERVER['REQUEST_URI']=str_replace("https://".$_SERVER["HTTP_HOST"],"",$_SERVER['REQUEST_URI']);
?>

Здесь в htaccess указанно правило, которое обязывает в начале всех скриптов запускать req_url.php, в котором, в свою очередь, написан простой фикс серверной переменной.

.

Оба эти файла находятся в корне папки с сайтами, дабы на всех сайтах всё отлично работало.

.

Янв, 5 Теги: , , ,
php | Комментариев нет

Аналог функции для сокетов, только с использованием курла. Постоянно теряю её на харде, поэтому выложу здесь:

<?php
set_time_limit(0);
ob_implicit_flush ();
//
//mr.The
//
 
/**
Функция получения страницы с использованием курла
**/
function get_page($url,$post='',$ref='',$cookie='',$ua="Opera 9.64 (compatible; MSIE 6.0; Windows NT 5.1; ru)",$proxy='') {
    $ch = curl_init();
 
    curl_setopt($ch, CURLOPT_URL,$url);
    curl_setopt($ch, CURLOPT_USERAGENT,$ua);
    curl_setopt($ch, CURLOPT_REFERER,$ref);
 
    curl_setopt($ch, CURLOPT_PROXY , $proxy);
 
    if($post!==''){
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
    }
 
    $headers [] = "Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1";
    $headers [] = "Accept-Language: ru,en;q=0.9,ru-RU;q=0.8";
    $headers [] = "Connection: close";
    $headers [] = "Cache-Control: no-store, no-cache, must-revalidate";
 
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
 
    curl_setopt($ch, CURLOPT_HEADER, 1); // тут лучше поставить 0, если куки не нужны
    curl_setopt($ch, CURLOPT_FAILONERROR, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    @curl_setopt($ch, CURLOPT_COOKIE, $cookie);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch, CURLOPT_TIMEOUT, 20);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);
    $result = curl_exec($ch);
    curl_close($ch);
    if($result)return $result; else    return false;
}
 
function get_cookie($page) {
    if(!preg_match_all("/Set-Cookie: (.*)(; |\n)/Ui",$page,$rnd)) return false;
 
    print_r($rnd);
 
    $co="";
    foreach($rnd[1] as $key) $co.=trim($key).";";
    return $co;
}
?>
Авг, 9 Теги: , ,
php | Комментариев нет

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

.

И закралась мне мысль.. Вобщем, вместо адреса сайта, а вбил «index.php». И что, вы думаете я увидел? Правильно, исходный пхп код index’a! Добраться до конфига, а из него и до базы не составило труда. Вот так file_get_contents слил всё на свете.

.

Баг он пофиксил заюзав мою функцию

(далее…)

Авг, 2 Теги: , ,
php, Уязвимости | Один комментарий