Настройка nginx для раздачи статики и экономия места на диске

При разработке сайтов возникает проблема хранения множества изображений и прочих медиа-файлов. Такие медиа-файлы могут занимать ощутимое количество места на диске, которое в век повального применения ssd дисков становится дороже. Да и бекапить такие данные часто накладно. Кроме того эти файлы создаются один раз и хранятся всё время существования сайта (зачастую), и таскать эти файлы за собой с сервера на сервер с каждым годом становится неприятно. Знакомо? Давайте попробуем разобраться как дешево можно решить проблему.

Читать далее Настройка nginx для раздачи статики и экономия места на диске

Как оптимизировать SQL запросы

Оптимизация SQL (в частности MySQL) довольно обширная тема и нет единого рецепта, который бы дал ответ на ваш конкретный вопрос. Поэтому попробую отталкиваясь от собственного опыта оптимизации сайтов поделиться своими знаниями в этом материале. Стоит также отметить, что речь сейчас будет только о запросах SELECT, остальные запросы не так критичны в плане скорости работы зачастую.

Читать далее Как оптимизировать SQL запросы

nginx + fastcgi + php-fpm + cache

В интернетах не смог нагуглить внятной инструкции по настройке связки nginx + php-fpm и при этом, чтобы nginx кешировал странички.
Почему-то инструкции либо по настройке fastcgi, либо по настройке кеша.
Совместить эти два мануала почему-то никто не осилил и это у меня вызвало некоторые сложности.
Конфиг php-fpm максимально стандартный, там не с чем особо мудрить
Короче, делюсь с вами инфой:

server {
        listen                  your_ip:80;
        server_name             example.com;

        access_log              /var/www/example.com/logs/nginx.access.log;
        error_log               /var/www/example.com/logs/nginx.error.log   info;
        root                    /var/www/example.com/www;
# Искренне не понимаю, почему в предыдущих 3х строчках нельзя использовать переменные. 
# Обжегся, когда пытался сделать красиво в конфиге
        index                   index.php;
# задаем индексный файл, который должен открываться сначала
# идея в том, что весь сайт роутится через него. но всегда есть необходимость открыть просто какой-нибудь пхп файлик
# поэтому оставляем эту возможность (подмена ниже)
        set     $fpm_name       "/index.php";

# блок конфига, который будет обрабатывать все запросы, кроме тех, что хотим кешировать
        location / {

                try_files   $uri $uri/ /index.php?$query_string;
                if ($uri ~ \.php$){
# а вот и подмена
                        set $fpm_name $uri; 
                }
                include         fastcgi_params;
                include         fpm_params;
        }
# описываем что хотим кешировать
        location ~* ^(\/(articles|reports)\/[0-9]+.+)$ {
# в моем случае не нужно кешировать, если пользователь авторизирован на сайте.
# если вам это не требуется, то просто удалите if
                if ($http_cookie !~* "cabinet") {
                        rewrite ^ /ng_cache last;
                }
                include         fastcgi_params;
                include         fpm_params;
        }
# внутренний урл для кеша
        location /ng_cache {
                internal;
                fastcgi_cache           examplecom_cache;
                fastcgi_cache_valid     200 301 302     304     3m;
                fastcgi_cache_key       "$request_method|$http_if_modifed_since|$http_if_none_match|$host|$request_uri";
                fastcgi_cache_use_stale error timeout invalid_header http_500;
                fastcgi_hide_header     "Set-Cookie";
                fastcgi_ignore_headers  "Cache-Control" "Expires";
                include                 fastcgi_params;
                include                 fpm_params;
        } 
        ........
}

и файлик fpm_params:

# не забываем указать правильный путь до сокета
fastcgi_pass    unix:/var/run/php-fpm/fcgi-php.sock;
fastcgi_index   $fpm_name;
# тут пригождается наша переменная $fpm_name
fastcgi_param   SCRIPT_FILENAME $document_root$fpm_name;
fastcgi_buffers 16      16k; 
fastcgi_buffer_size     32k

CSV выгрузка из PHP, которую понимает Excel

Надо сказать, что Excel любит формат не csv, а tsv. Иными словами, в данном формате разделителем является символ табуляции.
Помимо этого файл должен быть в кодировке UTF-16LE и содержать битовый маркер (BOM) — «\xFF\xFE»
Итого, вот такой код у вас должен получиться, чтобы cvs, создаваемый вами успешно открылся в экселе:

echo "\xFF\xFE";
// $output - переменная, в которой записан весь csv, UTF-8 - исходная кодировка, в которой находится $output
echo mb_convert_encoding($output, "UTF-16LE", "UTF-8");

Byte Order Mark (BOM) в PHP — как определить?

А очень просто!
Для этого вам понадобится вот такой вот код:

// читаем содержимое файла
$file = file_get_contents($path);
$sets = array(
	"\xFE\xFF" => "UTF-16BE",
	"\xFF\xFE" => "UTF-16LE",
	"\xFE" => "UTF-16",
	"\xFF" => "UTF-16",
	"\xEF\xBB\xBF" => "UTF-8",
	"\x2B\x2F\x76\x38\x2D" => "UTF-7",
	"\x2B\x2F\x76\x38" => "UTF-7",
	"\x2B\x2F\x76\x38" => "UTF-7",
	"\x2B\x2F\x76\x2B" => "UTF-7",
	"\x2B\x2F\x76\x2F" => "UTF-7",
	"\xF7\x64\x4C" => "UTF-1",
	"\x0E\xFE\xFF" => "SCSU",
	"\xFB\xEE\x28" => "BOCU-1",
	"\x00\x00\xFE\xFF" => "UTF-32BE",
	"\xFF\xFE\x00\x00" => "UTF-32LE",
	"\xDD\x73\x66\x73" => "UTF-EBCDIC",
	"\x84\x31\x95\x33" => "GB-18030",
);
// предполагаем, что изначально файл у нас не в utf
$is_utf = false;
$source_charset = "";
foreach ($sets as $bom => $charset) {
	// определяем битовый маркер
	if (mb_substr($file, 0, mb_strlen($bom)) == $bom) {
		// отрезаем битовый маркер и запоминаем кодировку
		$file = mb_substr($file, mb_strlen($bom));
		$source_charset = $charset;
		$is_utf = true;
		break;
	}
}
if (!$is_utf){
	// строка не в юникод кодировке, поэтому делаем соответсвующие, нужные вам преобразования
}else{
	// строка в юникоде, конвертируем ее в utf-8 или же в любую другую удобную вам кодировку
	$file = iconv($source_charset, "UTF-8", $file);
}

Таким образом вы сможете успешно определить кодировку присланного вам файла и распарсить его без лишних трудозатрат

Ни курсы, ни книги тут уже не помогут..

Пару дней назад я познакомился с мальчиком обновился сайт spbvoditel.ru. Ниже прикладываю скриншот сайта:
2013-08-04 03.18.19 am
Читать далее Ни курсы, ни книги тут уже не помогут..

Куда складывать загружаемые пользователями файлы для обработки их редакцией сайта?

Другой заголовок:
Как загрузить файлы в яндекс.диск с помощью php curl?
А очень просто :)
Необходим пакет php5-curl (если у вас debian и ему подобные)

и вот такой вот код в php:

if (is_uploaded_file($_FILES['file']['tmp_name'])){
	$filename = basename($_FILES['file']['name']);
	$filesize = filesize($_FILES['file']['tmp_name']);
	$fh = fopen($_FILES['file']['tmp_name'], 'r');
	$remoteUrl = 'https://webdav.yandex.ru/';
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $remoteUrl.$filename); 
	curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
	curl_setopt($ch, CURLOPT_USERPWD, "login@yandex.ru:password");
	curl_setopt($ch, CURLOPT_PUT, true);
	curl_setopt($ch, CURLOPT_INFILE, $fh);
	curl_setopt($ch, CURLOPT_INFILESIZE, $filesize);
	curl_exec($ch);
	fclose($fh);
}