Php touch не работает

PHP | сенсорный () функция

Функция touch () в PHP — это встроенная функция, которая используется для установки времени доступа и изменения указанного файла.
Имя файла, для которого необходимо установить время доступа и изменения, отправляется в качестве параметра вместе со временем функции touch () и возвращает True в случае успеха и False в случае ошибки. Файл создается первым, если он не существует.

Синтаксис:

Используемые параметры:
Функция touch () в PHP принимает три параметра.

  1. filename: это обязательный параметр, который указывает имя файла, время доступа и изменения которого необходимо изменить.
  2. время: это необязательный параметр, который указывает время. По умолчанию используется текущее системное время.
  3. atime: это необязательный параметр, который указывает время доступа. По умолчанию используется текущее системное время, если параметры не установлены.

Возвращаемое значение:
Возвращает True в случае успеха и False в случае неудачи.

Ошибки и исключения

  1. Разрешение по времени может отличаться в разных файловых системах, поэтому иногда вы можете получить неожиданные результаты.
  2. Параметр $ time в функции touch () имеет будущий предел около 1000000 секунд.
  3. Функция touch (), используемая в каталоге, возвращает FALSE и печатает «Отказано в доступе» в файловой системе NTFS и FAT.

Примеры:

Ниже программы иллюстрируют функцию touch ().

Предположим, есть файл с именем «gfg.txt»

Программа 1

// использование функции touch () для изменения модификации
// время файла до текущего системного времени

if (touch( $file_pointer ))

echo ( «$file_pointer modification time has been set to current system time.» );

echo ( «$file_pointer modification time cannot be changed.» );

Выход:

Программа 2

// установка времени касания на 5 часов в прошлом

$time = time() — 18000;

// использование функции touch () для изменения модификации
// время файла до текущего системного времени

if (touch( $file_pointer , $time ))

echo ( «$file_pointer modification time has been changed to 5 hours in the past.» );

echo ( «$file_pointer modification time cannot be changed.» );

Источник

touch — Устанавливает время доступа и модификации файла

(PHP 4, PHP 5, PHP 7)

touch — Устанавливает время доступа и модификации файла

Описание

Пытается установить время доступа и модификации файла с именем filename в значение time . Обратите внимание, что время доступа изменяется всегда, независимо от количества аргументов.

Если файл не существует, он будет создан.

Список параметров

Имя касаемого файла.

Время касания. Если аргумент time не указан, используется текущее время.

Если передан, время доступа указанного файла будет установлено в значение atime . В обратном случае оно будет установлено в значение параметра time . Если же ни один из этих параметров не был указан, то будет использовано текущее системное время.

Возвращаемые значения

Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.

Список изменений

Версия Описание
5.3.0 Стало возможным изменять время модификации директории в Windows.

Примеры

Пример #1 Пример использования функции touch()

Пример #2 Использование touch() с параметром time

// Это время касания, установим его на час назад.
$time = time () — 3600 ;

// Трогаем файл
if (! touch ( ‘some_file.txt’ , $time )) <
echo ‘Упс, что-то пошло не так. ‘ ;
> else <
echo ‘Касание файла прошло успешно’ ;
>
?>

Примечания

Учтите, что обработка времени может отличаться в различных файловых системах.

До версии PHP 5.3.0 было невозможно менять время модификации директории под Windows с помощью этой функции.

Источник

touch

(PHP 4, PHP 5, PHP 7, PHP 8)

touch — Устанавливает время доступа и модификации файла

Описание

Пытается установить время доступа и модификации файла с именем filename в значение time . Обратите внимание, что время доступа изменяется всегда, независимо от количества аргументов.

Если файл не существует, он будет создан.

Список параметров

Имя изменяемого файла.

Время изменения. Если аргумент time не указан, используется текущее время.

Если передан, время доступа указанного файла будет установлено в значение atime . В обратном случае оно будет установлено в значение параметра time . Если же ни один из этих параметров не был указан, то будет использовано текущее системное время.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования функции touch()

Пример #2 Использование touch() с параметром time

// Это время касания, установим его на час назад.
$time = time () — 3600 ;

// Изменяем файл
if (! touch ( ‘some_file.txt’ , $time )) <
echo ‘Упс, что-то пошло не так. ‘ ;
> else <
echo ‘Изменение модификации файла прошло успешно’ ;
>
?>

Примечания

Учтите, что обработка времени может отличаться в различных файловых системах.

User Contributed Notes 17 notes

Note that when PHP is called by f.e. apache or nginx instead of directly from the command line, touch() will not prefix the location of the invoking script, so the supplied filename must contain an absolute path.

With script started from /home/user/www, this will not touch «/home/user/www/somefile»:

I’ve been trying to set a filemtime into the future with touch() on PHP5.

It seems touch $time has a future limit around 1000000 seconds (11 days or so). Beyond this point it reverts to a previous $time.

It doesn’t make much sense but I could save you hours of time.

Update the access time without updating the modified time:

Unix command: touch -a filename

PHP: touch(filename, date(‘U’, filemtime(filename)), time())

To touch a file without being owner, it is much easier:

function touchFile ( $file ) <
fclose ( fopen ( $file , ‘a’ ));
>
?>

I has passed a small test to check which function is faster to create a new file.

file_put_contents vs touch

for( $i = 0 ; $i 100 ; $i ++)
<
file_put_contents ( ‘dir/file’ . $i , » );
>
?>
Average time: 0,1145s

for( $i = 0 ; $i 100 ; $i ++)
<
touch ( ‘dir/file’ . $i );
>
?>
Average time: 0,2322s

So, file_put_contents is faster than touch, about two times.

At least on Linux, touch will not change the time on a symlink itself, but on the file/directory it points to. The only way to work around this is to unlink the symlink, then recreate it.

It took a bit of searching to discover this. The OS itself provides no way to do it. Many people wondered why anyone would want to do this. I use symlinks inside a web tree to point to files outside the web tree. After a certain length of time has passed, I want the symlinks to die, so the files cannot be successfully hotlinked.

If you’re going to go around deleting (unlinking) files
that you don’t own just in order to change the modification
time on the file, you darn well better chown() the file
back to it’s original ownership after you are done and
chmod() it back to it’s correct permissions. Otherwise
you will almost certainly break things. Additionally the
code listed for touch()ing a file you don’t own should
set the file creation time back to it’s original time if
what is wanted is to just change the modification time.
Also, the code listed will break things if there is an i/o
error such as disk full or too many files in the directory.
Here’s how the code SHOULD be written:

Create the new file FIRST, rather than last, with a different
name such as $file.tmp.
Read the ownership, permissions, and creation time of the old file.
Set permissions and creation time of the new file the same as the old.
Rename the new file to the name of the old.
chown() the new file to the user that owned the file it’s replacing.

Please be careful adding to the documentation if you’ve
never taken programming 101.

I needed to use this to touch the /etc/cron.d directory when I updated some files in there. I know the docs say this isn’t necessary, but I’m finding that i need to do it in order form my changes to be picked up quickly.

I ran into the permissions error as well and I found that using chmod 777 /etc/cron.d does the trick.

So, you should be able to use the PHP touch function on a directory that has open write access.

Of course, this isn’t the most secure approach, but in our application it’s not a big deal for that folder to not be super secure.

A better explanation:

For file $file and UNIX time stored in vars $access and $modified

— change only access time
\touch($file, \filemtime($file), $access);

— change only modified time
\touch($file, $modified, \fileatime($file));

— change both access and modified time
\touch($file, $modified, $access);

Seeing the results:

//use a session cookie stored in a custom folder
$file = ‘/var/www/test_com/session/sess_qfn587cudfpgsijm1bs4d81s75’;
echo ‘stats for sess_qfn587cudfpgsijm1bs4d81s75
‘;
\clearstatcache();
echo ‘access: ‘.\date(«Y-m-d H:i:s», \fileatime($file)).’
‘;
echo ‘modified: ‘.\date(«Y-m-d H:i:s», \filemtime($file)).’
‘;
echo ‘change access to now, modified +1 hour
‘;
\touch($x, \filemtime($file)+3600, time());
\clearstatcache();
echo ‘access: ‘.\date(«Y-m-d H:i:s», \fileatime($file)).’
‘;
echo ‘modified: ‘.\date(«Y-m-d H:i:s», \filemtime($file)).’
‘;

Notice the double call to clearstatcache()!

Only way to change modification date in catalogue is to create file in via touch() and dalete it with unlink():

= ‘temp’ ;
$files1 = scandir ( $dir );

Источник

Шаблон программирования «Текучий интерфейс» в PHP. Свежий взгляд


При разработке программного обеспечения одной из важных составляющих является высокая читабельность исходного кода программы. Существуют специальные методики и рекомендации, которые позволяют добиться улучшения читабельности исходного кода. Одной из методик улучшения читабельности исходного кода является применение «текучих интерфейсов» (англ. Fluent Interface). О нем мы и поговорим в данной статье.

Эволюция. От простого к сложному.

Могу предположить, что каждый программист начинает свой путь PHP-программиста с написания банального приложения «Hello, world!». После которого будут идти долгие года изучения языка и неуклюжие попытки сделать что-то особенное: ORM/CMS/Framework (нужное подчеркнуть). Думаю, у всех есть тот код, который лучше никому не показывать. Но это абсолютно нормальный процесс развития, потому что без понимания простых вещей нельзя разобраться в сложных! Поэтому, давайте, повторим этот путь — начнем с простых примеров и дойдем до реализации «текучего» интерфейса в виде отдельного класса с помощью АОП. Те, кто знает этот шаблон программирования в ООП — могут смело переходить к последней части статьи, там можно получить отличную пищу для размышлений.

Приступим-с

Чтобы нам не пришлось ходить далеко за примером, давайте возьмем некоторую сущность пользователя, у которого есть свойства имени, фамилии, а также пароля:

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

Однако легко заметить, что у нас нет никакой валидации и можно сделать пароль пустым, что не очень хорошо. Помимо этого, было бы неплохо знать, что значения полей не изменяются без нашего ведома (Immutable). Эти несколько соображений приводят нас к мысли о том, что свойства должны быть защищенными или приватными, а доступ к ним осуществлять через пару геттер/сеттер. (примечание: этот подход как раз и лежит в основе прокси-классов Doctrine)

Для нового класса конфигурация немного изменилась и теперь использует вызов методов-сеттеров:

Вроде, ничего сложного, ведь так? А что если нам надо настроить 20 свойств? 30 свойств? Этот код будет засыпан вызовами сеттеров и постоянным появлением $user-> Если же имя переменной будет $superImportantUser , то читаемость кода ухудшится еще больше. Что же можно предпринять, чтобы избавиться от копирования этого кода?

Текучий интерфейс

Итак, мы подошли к шаблону программирования Fluent Interface, который был придуман Эриком Эвансом и Мартином Фаулером для повышения читабельности исходного кода программы за счет упрощения множественных вызовов методов одного объекта. Реализуется это с помощью цепочки методов (Method Chaining), передающих контекст вызова следующему методу в цепочке. Контекстом является значение, возвращаемое методом и этим значением может быть любой объект, включая текущий.

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

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

Как вы уже заметили, конфигурация объекта теперь занимает меньше места и читается значительно легче. Мы достигли поставленной цели! В этом месте у многих разработчиков должен возникнуть вопрос: «И что? Я это и так знаю. » Тогда попробуйте ответить на вопрос: «Чем плох текучий интерфейс в данном виде?» перед чтением следующего блока статьи.

Так чем же он плох?

Наверное, вы не нашли ответа и решили его прочитать? ) Ну тогда вперед! Спешу вас успокоить: на текущем уровне ООП с текучим интерфейсом все хорошо. Однако если подумать, то можно заметить, что его нельзя реализовать в виде отдельного класса и подключить к нужному объекту. Эта особенность выражается в том, что приходится монотонно проставлять return $this в конце каждого метода. Если же у нас пара десятков классов с парой десятков методов, которые мы желаем сделать «текучими», то приходится вручную заниматься этой неприятной операцией. Это и есть классическая сквозная функциональность.

Давайте наконец-то сделаем его с помощью отдельного класса

Так как у нас сквозная функциональность, то нужно подняться на уровень выше ООП и описать этот паттерн формально. Описание получается весьма простое — при вызове публичных методов в некотором классе необходимо возвращать в качестве результата метода сам объект. Чтобы не получить неожиданных эффектов — давайте сделаем уточнения: публичные методы должны быть сеттерами (начинаются на set) и классы будем брать только те, которые реализуют интерфейс-маркер FluentInterface.
Конечное описание «текучего» интерфейса в нашей реализации на PHP будет звучать так: при вызове публичных методов-сеттеров, начинающихся на set, и находящихся в классе, реализующем интерфейс FluentInterface — необходимо возвращать в качестве результата вызова метода сам объект, для которого осуществляется вызов, при условии что оригинальный метод ничего не вернул. Вот как! Теперь осталось дело за малым — опишем это с помощью кода АОП и библиотеки Go! AOP:

Первым делом, опишем интерфейс-маркер «текучего» интерфейса:

А дальше сама логика «текучего» интерфейса в виде совета внутри аспекта:

Сделаю небольшое пояснение — совет Around задает хук «вокруг» оригинального метода класса, полностью отвечая за то, будет ли он вызван и какой результат будет возвращен. Это будет со стороны выглядеть так, как будто мы взяли код метода и немного изменили его код, добавив туда наш совет. В самом коде совета мы сперва вызываем оригинальный метод сеттера и если он ничего не вернул нам, то возвращаем в качестве результата вызова оригинального метода сам объект $invocation->getThis() . Вот такая вот незатейливая реализация этого полезного шаблона программирования всего в пару строчек.

После всего этого, подключение «текучего» интерфейса в каждый конкретный класс приложения — простая и приятная работа:

Все, что нам нужно, чтобы использовать теперь текучий интерфейс в конкретном классе — просто добавить интерфейс — implements FluentInterface . Никакого копирования return $this по сотням методов, только чистый исходный код, понятный маркер интерфейса и сама реализация «текучего» интерфейса в виде простого класса аспекта. Всю работу возьмет на себя АОП.

Данная статья носит ознакомительный характер и предназначена исключительно для размышления о тех возможностях, которые могут быть доступны с помощью АОП в PHP. Надеюсь, вам было интересно узнать о реализации этого шаблона программирования.

Источник

Читайте также:  Как починить мышь logitech m510
Оцените статью