Мой подход к работе с Git

Второй день знакомлюсь с Git. Читаю книжку Pro Git, попутно загоняя буковки в консоль =)

Расскажу, как организовал процесс разработки на своём компьютере. Если что-то не правильно или есть лучшие способы, то смело пишите в комментах!

Более опытные коллеги подсказали, что ставить на локальный компьютер "Git сервер" не очень разумно, лучше обойтись одной папкой в которой будут размещаться голые (bare) репозитории и которая будет служить центральным хранилищем.

Итак. Создаём папку под голые репозитории, например C:\GitRepos (да да, я сижу на Windows):

$ mkdir /c/GitRepos

Создаём голый репозиторий myproject.git:

$ cd /c/GitRepos
$ mkdir myproject.git
$ cd myproject.git
$ git init --bare

Переходим в каталог, в котором располагаются исходники проекта myproject и создаём там новый локальный репозиторий:

$ git init

Связываем его с основным:

$ git remote add origin /c/GitRepos/myproject.git

Добавляем в локальный репозиторий файлы и делаем первый коммит:

$ git add .
$ git commit -a -m 'First commit'

Отправляем проект на "сервер" (в папку C:\GitRepos):

$ git push origin master

Теперь чтобы продолжить разработку myproject в другом месте, нужно сделать копию основного репозитория:

$ git clone /c/GitRepos/myproject.git

и после очередного коммита в локальный репозиторий, обновить основной:

$ git push

Получить свежую версию из основного репозитория, можно так:

$ git pull

Добавлено: 27 Июля 2018 22:52:42 Добавил: Андрей Ковальчук

mod_rewrite и GET параметры

В директиве RewriteRule нельзя обращаться к GET параметрам (той части запроса, которая идёт после символа ?), т.е. нельзя написать так:

# not work
RewriteRule ^node\?p=(\d+) index.php?q=node&page=$1

Зато это можно сделать в директиве RewriteCond:
# work
RewriteCond %{QUERY_STRING} p=(\d+)
RewriteRule ^node$ index.php?q=node&page=%1

Добавлено: 19 Июля 2018 21:50:02 Добавил: Андрей Ковальчук

Установка xCache на FreeBSD

xCache это PHP акселератор, ускоряющая исполнение скриптов путём кэширования их байткода.

xCache это альтернатива таким популярным акселераторам как APC и eAccelerator.

Забегая вперёд скажу, что после установки xCache, мой drupal блог стал работать ровно в два раза быстрее, по данным утилиты ab.

Установка
1. Обновляем порты (не обязательно):

# portsnap fetch update

2. Инсталлируем xCache:
# cd /usr/ports/www/xcache
# make install clean

При установке появится диалог с не отмеченным пунктом "Enable code coverage dumper", жмём OK.

3. Создаём конфиг xCache:
# cp /usr/local/share/examples/xcache/xcache.ini /usr/local/etc/php/

4. Редактируем конфиг:
# cd /usr/local/etc/php/
# ee xcache.ini

Например, на моём скромном VDS хостинге от FirstVDS, конфиг выглядит так:
[xcache-common]
extension = xcache.so
 
[xcache.admin]
xcache.admin.enable_auth = On
xcache.admin.user = "admin"
xcache.admin.pass = "md5_хэш_пароля"
 
[xcache]
xcache.shm_scheme = "mmap"
xcache.size = 16M
xcache.count = 1
xcache.slots = 8K
xcache.ttl = 0
xcache.gc_interval = 0
xcache.var_size = 2M
xcache.var_count = 1
xcache.var_slots = 8K
xcache.var_ttl = 0
xcache.var_maxttl = 0
xcache.var_gc_interval = 300
xcache.test = Off
xcache.readonly_protection = Off
xcache.mmap_path = "/dev/zero"
xcache.coredump_directory = ""
xcache.cacher = On
xcache.stat = On
xcache.optimizer = Off
 
[xcache.coverager]
xcache.coverager = Off
xcache.coveragedump_directory = ""

5. Перезапускаем Apache:
# /usr/local/etc/rc.d/apache22 restart

и по необходимости Nginx:
# /usr/local/etc/rc.d/nginx restart

Если Apache не запускается, и в лог ругается на Zend Optimizer:
PHP Fatal error: [Zend Optimizer] Extension "Zend Optimizer" cannot be loaded twice in Unknown on line 0

то нужно отключить расширение Zend Optimizer в php.ini.

Чтобы иметь доступ к административному интерфейсу xCache, нужно во первых, в конфиге, в параметре xcache.admin.pass, указать md5 хэш пароля, а во вторых скопировать директорию /usr/local/share/examples/xcache/admin в документ рут вашего веб-сервера.

Добавлено: 24 Июня 2018 08:40:58 Добавил: Андрей Ковальчук

Хочу динамично создавать поддомены вида username.site.zone

Как это сделать правильно?
Если нет необходимости поддержки различных директорий, то получается что-то вроде этого:

RewriteEngine on
    RewriteCond   %{HTTP_HOST}                 ^www\.[^.]+\.host\.com$
    RewriteRule   ^(.+)                        %{HTTP_HOST}$1          [C]
    RewriteRule   ^www\.([^.]+)\.host\.com(.*) /home/thescript.php?domain=$1&path=$2

Добавлено: 24 Мая 2018 21:35:39 Добавил: Андрей Ковальчук

Кодировка

Иногда браузер пользователя не может корректно определить тип кодировки выдаваемого документа. Для решения этой проблемы используемая кодировка указывается в настройках Web сервера Apache и заголовке передаваемого документа. Причем для корректного распознания эти кодировки должны совпадать. На наших серверах по умолчанию используется кодировка cp1251

В HTML для указания кодировки используется тег:

<meta http-equiv="content-type" content="text/html; charset=Windows-1251">

Наиболее часто встречаются типы кодировки для русского языка передаваемые в заголовке документа:

Windows-1251 — Кириллица (Windows).
KOI8-r — Кириллица (КОИ8-Р)
cp866 — Кириллица (DOS).
Windows-1252 — Западная Европа (Windows).
Windows-1250 — Центральная Европа (Windows).
UTF-8 — двух байтовая кодировка

Теперь рассмотрим указание кодировки по умолчанию через .htaccess. AddDefaultCharset задает дефолтную таблицу символов (кодировку) для всех выдаваемых страниц на веб сервере Apache. Указываем кодировку на все файлы, в которой по умолчанию получает документы браузер:
AddDefaultCharset WINDOWS-1251

При загрузке файла на сервер, возможна перекодировка, его — указываем, что все получаемые файлы будут иметь кодировку windows-1251, для того что бы указать кодировку на загружаемые файлы напишем:
CharsetSourceEnc WINDOWS-1251

Если необходимо отменить перекодировку сервером файлов:
CharsetDisable on

Добавлено: 24 Мая 2018 20:32:41 Добавил: Андрей Ковальчук

Коды ошибок сервера, 404, 403, 502, 504 и др.

Код состояния HTTP (англ. HTTP status code) является частью первой строки ответа сервера. Он представляет из себя целое число из трех арабских цифр. Первая цифра указывает на класс состояния. За кодом ответа обычно следует отделённая пробелом поясняющая фраза на английском языке, которая разъясняет человеку причину именно такого ответа. Пример:

403 Access allowed only for registered users

Клиент узнаёт по коду ответа о результатах его запроса и определяет, какие действия ему предпринимать дальше. Набор кодов состояния является стандартом, и все они описаны в соответствующих документах RFC. Введение новых кодов должно производится только после согласования с IETF. Клиент может не знать все коды состояния, но он обязан отреагировать в соответствии с классом кода.

В настоящее время выделено пять классов кодов состояния:
1xx: Informational (Информационный) - запрос получен и понят, а обработка продолжается.
2xx: Success (Успешно) - запрос был успешно получен, понят и обработан.
3xx: Redirection (Перенаправление) - для выполнения запроса должны быть предприняты дальнейшие действия.
4xx: Client Error (Ошибка клиента) - запрос имеет плохой синтаксис или не может быть выполнен.
5xx: Server Error (Ошибка сервера) - сервер не в состоянии выполнить допустимый запрос.

Ниже представлены коды ответа из реестра кодов состояния IANA.
Коды 3xx (перенаправление)

Перечень кодов статуса HTTP, использующихся при перенаправлении запроса(коды 3xx)

300 Множественный выбор
Затребованный URL обозначает более одного ресурса, и робот не смог однозначно определить, к какой странице URL относится (получен код 300 Multiple Choices).
Исправьте заголовки или укажите ресурс правильно, и тогда робот сможет проиндексировать страницу.

301 Ресурс перемещен навсегда
Документ уже не используется сервером, а ссылка перенаправляет на другую страницу (получен код 301 Moved Permanently).
Так как пользователи не смогут увидеть подобные документы, показывать их в поиске не имеет смысла, и робот их не индексирует. Однако робот обязательно проиндексирует страницу, на которую установлено перенаправление.

302 Ресурс временно перемещен
Запрошенный ресурс временно находится под другим адресом (получен код 302 Moved Temporarily).
Так как пользователи не смогут увидеть подобные документы, показывать их в поиске не имеет смысла, и робот их не индексирует. Однако робот обязательно проиндексирует страницу, на которую установлено перенаправление.

303 Смотрите другой ресурс
Запрошенный ресурс находится под другим адресом и его следует запрашивать, используя метод GET (получен код 303 See Other). Если вы хотите, чтобы указанная страница находилась в поиске, она должна отвечать кодом 200.

304 Ресурс не изменялся
Получен код 304 Not Modified. Если страница не изменилась с момента последнего обращения робота, рекомендуется выдавать этот код. Это ускорит индексацию и уменьшит трафик.

305 Следует использовать прокси
Доступ к затребованному ресурсу может осуществляться только через прокси-сервер, указанный в заголовке Location (получен код 305 Use Proxy).

307 Временное перенаправление
Затребованный ресурс был временно переведен на другой адрес, который необходимо прописать в Location (получен код 307 Temporary Redirect).
Коды 4xx (ошибка клиента)

Содержит перечень кодов статуса HTTP, использующихся для обозначения возможных ошибок в клиентском запросе (коды 4xx).

400 Неверный запрос
Запрос не может быть понят сервером из-за некорректного синтаксиса (получен код 400 Bad Request).

401 Неавторизованный запрос
Для доступа к документу необходимо вводить пароль или быть зарегистрированным пользователем (получен код 401 Unauthorized).

402 Необходима оплата за запрос
Внутренняя ошибка или ошибка конфигурации сервера (получен код 402 Payment Required).

403 Доступ к ресурсу запрещен
Доступ к документу запрещен (получен код 403 Forbidden). Если вы хотите, чтобы страница индексировалась, необходимо разрешить доступ к ней.

404 Ресурс не найден
Документ не существует (получен код 404 Not Found). Если вы удалили какой-то раздел сайта, можно с помощью robots.txt запретить роботу обращаться к нему. Если такой страницы на сайте никогда не существовало, игнорируйте эту ошибку, возможно, кто-то поставил некорректную ссылку на ваш сайт.

405 Недопустимый метод
Метод, определенный в строке запроса (Request-Line), не дозволено применять для указанного ресурса, поэтому робот не смог его проиндексировать (получен код 405 Method Not Allowed).

406 Неприемлемый запрос
Нужный документ существует, но не в том формате (язык или кодировка не поддерживаются роботом). Получен код 406 Not Acceptable.

407 Требуется идентификация прокси, файервола
Необходима регистрация на прокси-сервере (получен код 407 Proxy Authentication Required).

408 Время запроса истекло
Сайт не передал полный запрос в течение установленного времени и робот разорвал соединение (получен код 408 Request Timeout).

409 Конфликт
Запрос конфликтует с другим запросом или с конфигурацией сервера (получен код 409 Conflict).

410 Ресурс недоступен
Затребованный ресурс был окончательно удален с сайта (получен код 410 Gone).

411 Необходимо указать длину
Сервер отказывается принимать запрос без определенного заголовка Content-Length (получен код 411 Length Required). Поправьте заголовки на своем сервере;- тогда в следующий раз робот сможет проиндексировать страницу.

412 Сбой при обработке предварительного условия
При проверке на сервере одного или более полей заголовка запроса обнаружено несоответствие (сбой или ошибка при обработке предварительного условия). Получен код 412 Precondition Failed.

413 Тело запроса превышает допустимый размер
Сервер отказывается обрабатывать запрос потому, что размер запроса больше того, что может обработать сервер (получен код 413 Request Entity Too Large).

414 Недопустимая длина URI запроса
Сервер отказывается обслуживать запрос, потому что запрашиваемый роботом URI (Request-URI) длиннее, чем сервер может интерпретировать (получен код 414 Request-URI Too Long).

415 Неподдерживаемый MIME тип
Сервер отказывается обрабатывать запрос, потому что тело запроса имеет неподдерживаемый формат (получен код 415 Unsupported Media Type).

416 Диапазон не может быть обработан
Сервер отказывается обрабатывать запрос, потому что значение поля Range в заголовке запроса указывает на недопустимый диапазон байтов (получен код 416 Requested Range Not Satisfiable).

417 Сбой при ожидании
Сервер отказывается обрабатывать запрос, потому что значение поля Expect в заголовке запроса не соответствует ожиданиям (получен код 417 Expectation Failed).

422 Необрабатываемый элемент
Сервер не в состоянии обработать один (или более) элемент запроса (получен код 422 Unprocessable Entity).

423 Заблокировано
Сервер отказывается обработать запрос, так как один из требуемых ресурсов заблокирован (получен код 423 Locked).

424 Неверная зависимость
Сервер отказывается обработать запрос, так как один из зависимых ресурсов заблокирован (получен код 424 Failed Dependency).

426 Требуется обновление
Сервер запросил апгрейд соединения до SSL, но SSL не поддерживается клиентом (получен код 426 Upgrade Required).
Коды 5xx (ошибка сервера)

Перечень кодов статуса HTTP, использующихся для обозначения возможных ошибок сервера (коды 5xx)

500 Внутренняя ошибка сервера
Сервер столкнулся с непредвиденным условием, которое не позволяет ему выполнить запрос (получен код 500 Internal Server Error).

501 Метод не поддерживается
Сервер не поддерживает функциональные возможности, требуемые для выполнения запроса (получен код 501 Not Implemented). Этот ответ соответствует состоянию, когда сервер не распознает метод запроса и не способен обеспечить его для любого ресурса.

502 Ошибка шлюза
Сервер, действуя в качестве шлюза или прокси-сервера, получил недопустимый ответ от следующего сервера в цепочке запросов, к которому обратился при попытке выполнить запрос (получен код 502 Bad Gateway).

503 Служба недоступна
Возникла ошибка из-за временной перегрузки или отключения на техническое обслуживание сервера (получен код 503 Service Unavailable).

504 Время прохождения через межсетевой шлюз истекло
Сервер, при работе в качестве внешнего шлюза или прокси-сервера, своевременно не получил отклик от вышестоящего сервера, к которому он обратился, пытаясь выполнить запрос (получен код 504 Gateway Timeout).

505 Версия НТТР не поддерживается
Сервер не поддерживает или отказывается поддерживать версию HTTP-протокола, которая используется в сообщении запроса робота (получен код 505 HTTP Version Not Supported).

507 Недостаточно места
Сервер не может обработать запрос из-за недостатка места на диске (получен код 507 Insufficient Storage).

510 Отсутствуют расширения
Сервер не может обработать запрос из-за того, что запрашиваемое расширение не поддерживается (получен код 510 Not Extended).

Добавлено: 10 Мая 2018 21:36:37 Добавил: Андрей Ковальчук

Загрузка больших файлов на сервер используя PHP

Здравствуйте. Сегодня мы поговорим с Вами о том, как можно увеличить размер загружаемого файла в PHP. С такой проблемой сталкиваются многие, однако они и не догадываются, как же все-таки ее правильно решить... Ниже Вы можете скачать исходные файлы, необходимые для работы данного урока:

Большинство веб-серверов сформировано так, что пользователь сайта на этом сервере может загружать файлы размером только до 2MB. Так, если, например, пользователь хочет загрузить на сервер какой-нибудь архив с полезной программой размером в 15МВ, то его попытки будут напрасны, файл не загрузится. К счастью, уже довольно давненько появился один метод решения этой проблемы, и многие уже успешно им воспользовались. Я как раз и хочу рассказать Вам о нем.

Ниже я по пунктам расскажу все то, что Вам очень пригодится для увеличения размера загружаемого файла:

В корне своего веб-сервера создайте файл .htaccess;
Откройте файл .htaccess и вставьте в него следующий код:

php_value upload_max_filesize 20M
php_value post_max_size 20M
php_value max_execution_time 200
php_value max_input_time 200

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

Судя по вышеприведенному коду становится теперь понятно, что максимальный размер загрузки файла на сервер равен 20МВ и файл который мы закачиваем должен успеть закачаться за 200 секунд, если же этого не происходит, то файл не закачивается, из этого следует вывод об увеличении данного параметра. Также Вы можете изменить максимальный размер загрузки файла до бесконечности, именно столько, сколько Вам потребуется.

На этом мой урок подошел к концу. Думаю, что Вам очень пригодится этот материал. Если что-нибудь будет непонятно - пишите в комментариях, я все для Вас подробно объясню. До свидания.

Добавлено: 09 Мая 2018 14:47:37 Добавил: Андрей Ковальчук

Использование CRON и команды crontab

Названия каталогов и файлов описаны для Linux(RedHat). Для других операционных систем, названия могут отличаться, но принцип работы cron точно такой же.

Cron это программа, выполняющая задания по расписаню. Позволяет неоднократный запуск заданий. Т.е. задание можно запустить в определенное время или через определенный промежуток времени. Формат и значения полей, для пользовательских файлов crontab, будут приведены в конце статьи.

При загрузке системы, запускается демон cron и проверяет очередь заданий at и заданий пользователей в файлах crontab. При запуске, демон cron сначала проверяет каталог /var/spool/cron на наличие файлов crontab, файлы crontab имеют имена пользователей, соответствующие именам пользователей из /etc/passwd Каждый пользователь может иметь только один файл crontab, записей в файле может быть несколько.

Другими словами - файлы crontab содержат инструкции для демона cron, который запустит задание(я) описаное в файле crontab. Все файлы crontab из каталога /var/spool/cron загружаются в память, одновременно с ними загружаются файлы из /etc/cron.d После этого демон cron загружает содержимое файла /etc/crontab При стандартных настройках, содержимое /etc/crontab имеет следующий вид:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

Информация файла указывает, что:

содержимое каталога /etc/cron.hourly будет запускаться каждый час на первой минуте часа.
содержимое каталога /etc/cron.daily будет запускаться каждый день на второй минуте четвертого часа.
содержимое каталога /etc/cron.weekly будет запускаться каждое воскресенье на 22'ой минуте 4'го часа.
содержимое каталога /etc/cron.monthly будет запускаться каждый первый день месяца на 42'ой минуте 4'го часа.
SHELL=/bin/bash означает использовать для запуска команд /bin/bash , если переменная не указана, то значение будет взято из /etc/passwd для пользователя являющимся владельцем файла.

HOME=/ корневой каталог для пользователя (параметр не обязательный) При необходимости доступа к специальным свойствам интерпретатора, значения переменных SHELL и HOME можно изменить, не зависимо от того, что прописано в /etc/passwd

MAILTO=root означает кому отсылать сообщение о результате работы команд.

Все содержимое из этих каталогов будет запускаться с правами доступа пользователя root и файлы должны иметь права доступа на "выполнение" (про права доступа читай статью http://rst.void.ru/texts/chmod.txt) Поэтому перед размещением файлов в одном из этих каталогов необходимо убедиться, что сценарии не насесут вред системе.

После того, как демон cron запущен и прочел содержимое всех файлов crontab, он бездействует, просыпаясь каждую минуту и проверяя не требуется ли запуск какой-либо команды в данную минуту, или не появился ли новый файл crontab который необходимо обработать. Демон cron определяет изменения по времени модификации файлов или каталогов, такое его свойство избавляет от необходимости перезапуска демона.

Как отмечалось выше, размещение файлов для cron в каталогах
/etc/cron.hourly
/etc/cron.daily
/etc/cron.weekly
/etc/cron.monthly

доступно только пользователю root, для использования файлов crontab пользователями, нужно использовать команду crontab. Команда служит для создания, изменения и добавления файла для демона cron

Пример
Рассмотрим пример создания файла crontab для пользователя user ,домашняя директория /home/user

Задача: запускать каждую минуту файл /home/user/mail, который будет отправлять почту
#содержимое файла mail (файл должен быть с правами на запуск! например -rwxr-xr-x)
#!/bin/bash
mess="test cron"
echo "$mess" |mutt -s "subj" -m application/octet-stream bob@server.ru

1.Создаем временный файл /home/user/test содержимое файла test такое:
SHELL=/bin/bash
MAILTO=user
0-59 * * * * /home/user/mail

2. Запускаем в терминале команду crontab /home/user/test

Все. После этого в каталоге /var/spool/cron будет создан файл "user" примерно с таким содержимым
# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (/home/user/test installed on Mon Mar 29 02:31:34 2004)
# (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $)
SHELL=/bin/bash
MAILTO=user
0-59 * * * * /home/user/mail

и файл /home/user/mail будет запускаться демоном cron каждую минуту.

Доступ в каталог /var/spool/cron непривилегированому пользователю закрыт, что бы посмотреть юзером "user" есть ли у него файл crontab ,достаточно набрать команду crontab -l , если файл существует-будет показано его содержимое.

Для удаления файла используется команда crontab -r

Для редактирования crontab -e

Для управления файлами crontab пользователем "root" используется синтаксис:

-------------------------
crontab -u user_name file       -создание файла crontab
-------------------------        из файла "file" для
                                  юзера "user_name"

-u означает чей crontab будет обработан, Если опция не задана, то будет обработан crontab того пользователя, который запустил команду crontab.

-------------------------
crontab -u user_name -l       -просмотр файла crontab
-------------------------       юзера "user_name"

-------------------------
crontab -u user_name -r       -удаление файла crontab
-------------------------       юзера "user_name"

-------------------------
crontab -u user_name -e       -редактирование файла crontab
-------------------------      юзера "user_name" используя
                               редактор, заданный переменной
                               окружения VISUAL или EDITOR

Формат и значения полей
Каждая команда в пользовательском файле crontab занимает одну строку и состоит из шести полей. Пользовательские файлы crontab находятся в каталоге /var/spool/cron

Общий формат команды:

------------------------------------------------
минута час день_месяца месяц день_недели команда
------------------------------------------------

Допустимые значения:
минута        от 0 до 59
час           от 0 до 23
день_месяца   от 1 до 31
месяц         от 1 до 12 (можно три буквы из названия месяца,
                          регистр не имеет значения от jan до dec)
день_недели   от 0 до 6  (0 это воскресенье, 
                          можно писать от sun до sat)

Каждое из полей даты и времени может быть обозначено символом * ,будет соответствовать любому возможному значению. Для этих полей можно указывать диапазоны значений, разделенных дефисом, например:

* 5 4-10 0-3 * echo "HELLO"    -печать HELLO в 5:00 на 4,5,6,7,8,9,10
                                дни января, февраля, марта и апреля

пошаговая запись

* */2 * * sat echo "HELLO"     -печать HELLO каждый четный час,
                                каждую субботу

равнозначная предыдущему примеру запись (списком)

* 0,2,4,6,8,10,12,14,16,18,20,22 * * sat echo "HELLO"  
                               -печать HELLO каждый четный
                                час, каждую субботу

то же самое с указанием диапазона

* 0-23/2 * * sat echo "HELLO"  -печать HELLO каждый четный
                                час, каждую субботу

59 23 31 dec * echo "Happy new year" -без комментариев :),
                                      поздравит с новым годом

Для отладки задания cron, можно перенаправить результат в файл

Пример:

0-59 * * * * /home/user/mail 2>/tmp/tmp.cron

Если при запуске команды /home/user/mail возникнут ошибки, то они будут записаны в файл /tmp/tmp.cron и вы всегда сможете узнать причину. В случае перенаправления вывода в файл, письмо, юзеру указаному в переменной MAILTO отправлено не будет.

Посмотреть информацию о всех командах запускаемых демоном cron можно в каталоге /var/log называются cron, cron1 и т.д.

В файле /var/log/cron записано время запуска всех заданий cron за предыдущий день

Mar 29 04:03:00 rst CROND[4434]: (user) CMD (/home/user/mail) 
Mar 29 04:03:59 rst CROND[4493]: (user) CMD (/home/user/mail) 
Mar 29 04:05:00 rst CROND[4507]: (user) CMD (/home/user/mail) 
Mar 29 04:06:00 rst CROND[4549]: (user) CMD (/home/user/mail) 

В остальных файлах cron1,cron2 находится подобная информация, но более старая чем в cron

Вот практически и все, что требуется знать для использования cron и crontab.

Добавлено: 03 Мая 2018 12:16:37 Добавил: Андрей Ковальчук

Сколько нужно резервных копий?

Сразу скажу правильный ответ: «Сколько не делай, все равно будет мало!» :-)

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

Как раз такая ситуация у меня и возникла. 12-ого февраля все было нормально, а 13-ого я увидел, что в блоге не хватает двух последних записей.

Проблема была с сервером хостера («разрушилась файловая система» — по их словам). Данные были восстановлены по резервной копии за 10-ое февраля.

Недостающие статьи я, конечно, быстро восстановил (кроме резервных копий блога я отдельно сохраняю все вордовские файлы, картинки, исходники и т.п.).

Но вот с комментариями оказалось сложнее. Какие-то я восстановил, а какие-то – мог пропустить. За что я прошу прощения у их авторов.

Поэтому если вы вдруг не увидите своего комментария, просто отправьте его еще раз.

Вместо заключения.

Ситуация, безусловно, неприятная, но очень поучительная. Нельзя переоценивать свои силы и быть слишком уверенным в себе :-) .

Естественно, я пересмотрю подход к созданию резервных копий.

И еще раз прошу прощения за потерянные комментарии.

Добавлено: 21 Апреля 2018 06:37:53 Добавил: Андрей Ковальчук

Заголовок If-Modified-Since, если PHP не установлен как моду

Наверное, каждый веб-программист, интересующийся кешированием веб-страниц на стороне клиента, знает о таких заголовках HTTP, как «If-Modified-Since» и «If-None-Match». Данные заголовки отправляются браузером при обращении к странице, которая имеется в его кеше. Для правильной организации кеширования на стороне клиента, серверному приложению необходимо отправлять заголовок «HTTP/1.0 304 Not Modified» и прекращать передачу данных в случае, если содержимое запрашиваемой страницы не изменилось с того момента времени, которое указано в присланном заголовке «If-Modified-Since».

Основная проблема при реализации кеширования на стороне клиента заключается в том, чтобы получить содержимое заголовка «If-Modified-Since». Вызвана она тем, что по умолчанию указанный заголовок доступен из серверного приложения только в том случае, если интерпретатор PHP установлен в качестве модуля Apache, что бывает крайне редко на серверах организаций, предлагающих услуги хостинга (по соображениям безопасности и удобства перекомпиляции PHP). Следует заметить, что кеширование на стороне клиента благотворно влияет не только на нагрузку веб-сервера, но и на скорость индексации веб-сайта поисковыми машинами. В связи с этим, опытные SEO-специалисты упорно ищут и рекомендуют «правильные» хостинговые компании.

На самом деле, существует универсальное решение данной проблемы, не требующее вмешательства в глобальную конфигурацию веб-сервера и работающее даже в том случае, когда PHP не установлен в качестве модуля Apache. Для применения данного метода необходимо и достаточно, чтобы выполнялись следующие условия:

* возможность конфигурации через файлы .htaccess;
* доступность и возможность использования модуля mod_rewrite;
* в серверном приложении к заголовкам «If-Modified-Since» и «If-None-Match» необходимо обращаться через массив $_SERVER, а не при помощи функций getallheaders или apache_request_headers (эти функции доступны только в том случае, если PHP установлен в качестве модуля Apache).

Итак, для реализации доступа к заголовкам «If-Modified-Since» и «If-None-Match» необходимо в корневом каталоге веб-сайта поместить файл .htaccess следующего содержания:

RewriteEngine On
RewriteRule .* - [E=HTTP_IF_MODIFIED_SINCE:%{HTTP:If-Modified-Since}]
RewriteRule .* - [E=HTTP_IF_NONE_MATCH:%{HTTP:If-None-Match}]

После этого, необходимые заголовки будут доступны как $_SERVER['HTTP_IF_MODIFIED_SINCE'] и $_SERVER['HTTP_IF_NONE_MATCH']. В случае если на веб-сайте mod_rewrite используется для формирования «красивых» URL, содержимое .htaccess примет вид:

# url rewriting
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA]

# If-Modified-Since (if php is not installed as cgi then comment lines below)
RewriteRule .* - [E=HTTP_IF_MODIFIED_SINCE:%{HTTP:If-Modified-Since}]
RewriteRule .* - [E=HTTP_IF_NONE_MATCH:%{HTTP:If-None-Match}]

Следует заметить, что заголовки «If-Modified-Since» и «If-None-Match» не отправляются браузером, если в предыдущих запросах к данной странице он не получал в ответе веб-сервера заголовок Last-Modified. Кроме того, при использовании в веб-приложении сессий с установками по умолчанию, указанные заголовки также не будут присылаться браузером. Для того чтобы избежать такого поведения браузера, необходимо перед запуском сессии выполнять функцию session_cache_limiter, передавая в качестве аргумента параметр 'private_no_expire':

<?php

session_cache_limiter('private_no_expire');
session_start();

?>

Добавлено: 20 Апреля 2018 09:34:58 Добавил: Андрей Ковальчук

Как запустить домен РФ на Денвере (Denwer)

Если мы просто напишем в названии папки нашеимя.рф и перезапустим денвер ничего работать не будет. На самом деле домены рф это иллюзия. Реально нашеимя.рф будет выглядеть так xn—80akjqb1e8b.xn—p1ai. Называется это дело Punycode. Т.е. для того чтобы запустить наш сайт с кириллическим именем на Денвере необходимо:

Ищем Punycode конвертор (полно сайтов на которых он есть).
Вбиваем туда наше кириллическое имя.
Далее в названии папки для денвера пишем не нашеимя.рф, а полученный из конвертера результат.
Для CodeIgniter указываем в config.php вместо кириллицы punycode.

$config['base_url'] = 'xn—80akjqb1e8b.xn—p1ai';

Добавлено: 20 Апреля 2018 08:46:30 Добавил:

Коды ошибок сервера

400 Bad Reques

В запросе клиента сервер нашел синтаксическую ошибку
401 Onautorized

Запрос требует аутентификации пользователя
403 Forbidden

Доступ к запрашиваемому ресурсу запрещен. Клиент не должен повторять запрос
404 Not Found

Запрашиваемый документ на сервере отсутствует
405 Method Not Allowes

Метод запроса, используемый клиентом, неприемлем
406 Not Acceptable

Запрашиваемый ресурс недоступен в том формате, который может принимать клиент
407 Proxy Authentification Required

Несанкционированный запрос доступа к proxy-серверу. Сервер отправляет заголовок Ргоху-Authentificate со схемой аутентификации и областью запрашиваемого ресурса
408 Request Time-Out

Клиент не завершил свой запрос за время ожидания запроса, заданное серверу
409 Conflict

Возник конфликт запроса клиента с другим запросом
410 Gone

Запрашиваемый ресурс удален с сервера
411 Length Required

В своем запросе клиент должен предоставить заголовок Content-Length, в котором указан размер запроса
413 Request Entit y Too Large

Сервер отказывается обрабатывать запрос: слишком большое тело сообщения. Сервер может прервать соединение, чтобы клиент не продолжал отправлять этот запрос
414 Request-URI Too Long

Сервер отказывает обрабатывать запрос: слишком большой размер заданного URI
415 Unsupported Media Type

Сервер отказывается обрабатывать запрос: отсутствует поддержка формата тела сообщения
500 Internal Server Error

Ошибка конфигурации сервера или внешней программы
501 Not Implemented

Сервер не поддерживает требуемые функции для выполнения запроса
502 Bad Gateway

Неверный ответ вышестоящего сервера или proxy-сервера
503 Service Unavailabel

Служба временно недоступна
505 HHTP Version Not Supported

Версия HTTP, используемая клиентом, не поддерживается

Перехват ошибок и своя выдача
Для перехвата ошибки в .htaccess пишем строки:
ErrorDocument 404 /404.html
ErrorDocument 500 /500.html

Естсетвенно Вы можете поменять код ошибки и выводить любую страницу, даже динамическую.

Добавлено: 18 Апреля 2018 21:05:55 Добавил: Андрей Ковальчук

Включение механизма Server-Side Includes

Любой документ, у которого будет установлен обработчик "server-parsed" будет сканироваться этим модулем, если включена опция "includes". Если вы имеете малое количество документов с ssi, то лучше всего в файле httpd.conf указать следующее:

addtype text/html .shtml addhandler server-parsed .shtml

и устанавливать у таких файлов расширение .shtml. Если же все или почти все документы будут иметь директивы ssi, то лучше в файле конфигурации указать:

addhandler server-parsed .html

И не забудьте включить в опции директории узла опцию includes:

options +includes

Конечно в этой строке могут быть и другие нужные вам опции

Добавлено: 16 Апреля 2018 07:39:44 Добавил: Андрей Ковальчук

Перенаправление постоянных ссылок на основе Дня и имени на /%postname%/

Сначала зайдите в админку WordPress, зайдите в Settings &#8594; Permalinks и выберите custom.
Заполните поле с /%postname%/.
Теперь постоянные ссылки будут выглядеть так:

httр://www.yourblog.com/name-of-the-post

Теперь нам нужно перенаправить все старые ссылки на новые постоянные.
Внесите в .htaccess следующие строки:
RedirectMatch 301 /([0-9]+)/([0-9]+)/([0-9]+)/(.*)$ httр://www.domain.com/$4

Добавлено: 07 Апреля 2018 21:31:51 Добавил: Андрей Ковальчук

Сжатие статических данных

Этот код уменьшит объём данных передаваемых между сервером и пользователем за счет их сжатия.

AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml application/xhtml+xml text/javascript text/css application/x-javascript
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4.0[678] no-gzip
BrowserMatch bMSIE !no-gzip !gzip-only-text/html

Добавлено: 07 Апреля 2018 21:30:58 Добавил: Андрей Ковальчук