- Php create a file if not exists
- Как создать файл (PHP)
- fopen()
- file_put_contents()
- Примечание
- Категории
- Читайте также
- Комментарии
- Вход на сайт
- Социальные сети
- Ошибка при открытии потока в PHP: отсутствует файл или каталог
- Ответ 1
- Контрольный список
- 1. Проверьте путь к файлу на предмет опечаток
- 2. Убедитесь, что путь к файлу правильный с точки зрения относительного и абсолютного пути
- 3. Проверьте свои пути включения
- 4. Убедитесь, что у вашего сервера есть доступ к этому файлу
- 5. Проверьте настройки PHP
- Другие случаи
- 1. Включение библиотеки на основе пути включения
- 2. SELinux
- 3. Symfony
- 4. Внутри Zip-файла символы, отличные от A SC II
- Ответ 2
- Программное обеспечение для виртуального хостинга
- Права доступа к файлам
- Ответ 3
- PHP не может создать файл и записать данные
Php create a file if not exists
If you can’t create the file, that’s probably because the directory is not writeable by the web server user (usually «www» or similar).
Do a chmod 777 folder to the folder you want to create the file and try again.
Read the answer again. I didn’t say anything about root folder. Let’s assume you have a username like «bob». The web server runs as a completely different user (let’s say «www»). «www» can’t write «bob»‘s folders, unless: 1) «www» is added to «bob»‘s group and the folder has 775 permissions at least. 2) You change the owner of the folder from «bob» to «www» (using chown ). 3) The folder is writeable by any user (it has 777 permissions, you can change them using chmod ).
Use the function is_file to check if the file exists or not.
If the file doesn’t exist, this sample will create a new file and add some contents:
To be sure that a file exists before doing anything with it you can just touch it:
if (!file_exists('somefile.txt'))
This will just create an empty file having the current time as creation time. The advantage over fopen is that you don’t have to close the file.
You can also set the creation time, if you want. The following code will create a file with a creation time of yesterday:
if (!file_exists('somefile.txt'))
However: You should care about the fact that a file’s modification time will be changed if you use touch for files which already exists.
Как создать файл (PHP)
Создать файл в PHP можно двумя способами. Функцией fopen() и функцией file_put_contents() . Функция file_put_contents() лучше использовать только в случае обычной записи/дозаписи текста в файл, в остальных случаях лучше использовать fopen() .
fopen()
Например нужно создать файл data.txt и записать в него текстовую информацию.
В результате в файле data.txt будет следующая информация:
file_put_contents()
Функция int file_put_contents (string filename, mixed data [, int flags [, resource context]]) повторяет вызов функций fopen(), fwrite(), fclose().
Например нужно создать файл data2.txt и записать в него текстовую информацию.
В результате в файле data2.txt будет:
Если вы хотите этой функцией file_put_contents() записать информацию в уже существующий файл, при это сохранив информацию в нем, то в качестве третьего параметра нужно передать константу FILE_APPEND .
В результате в файле будет следующая информация:
Примечание
При создании файла убедитесь, что у папки, где будет создаваться файл, выставлены права доступа для создания файлов.
Категории
Читайте также
- Как очистить файл не удаляя его (PHP)
- Как скопировать файл (PHP)
- Как очистить папку (PHP)
- Как дописать в конец файла (PHP)
- Как проверить права доступа (PHP)
- Дата изменения файла (PHP)
- Список файлов в папке (PHP)
- Массив в JSON (PHP)
- Скачать файл с сервера (PHP)
- Как на PHP скачать файл
- Как записать массив в файл (PHP)
- Как создать папку (Perl)
Комментарии
Вход на сайт
Введите данные указанные при регистрации:
Социальные сети
Вы можете быстро войти через социальные сети:
Ошибка при открытии потока в PHP: отсутствует файл или каталог
В PHP скриптах, вызывая include() , require() , fopen() или их производные, такие как include_once , require_once или даже move_uploaded_file() , часто появляются ошибки или предупреждения:
Не удалось открыть поток: нет такого файла или каталога.
Как быстро найти первопричину проблемы?
Ответ 1
Есть много причин, по которым можно столкнуться с этой ошибкой, и поэтому я дам контрольный список того, что необходимо проверить в первую очередь для решения этой ситуации.
Предположим, у нас есть следующая строка:
require «/path/to/file»
Контрольный список
1. Проверьте путь к файлу на предмет опечаток
- проверьте вручную (визуально проверив путь) ;
- переместите все, что вызывается с помощью require* или include* в переменную, скопируйте ее и попробуйте получить к ней доступ с терминала:
2. Убедитесь, что путь к файлу правильный с точки зрения относительного и абсолютного пути
- если он начинается с косой черты «/», то это относится не к корню папки вашего веб-сайта (корень документа), а к корню вашего сервер :
- например, каталог вашего веб-сайта может быть /users/tony/htdocs ;
- не относительно пути к корню вашего веб-сайта или файла ;
- или всегда используйте абсолютные пути к файлам .
- используйте require __DIR__.»/relative/path/from/current/file» , который возвращает каталог текущего файла ;
- определите SITE_ROOT константу самостоятельно:
- в корне каталога вашего веб-сайта создайте файл, например , config.php
- в config.php напишите :
- в каждом файле, в котором вы хотите сослаться на корневую папку сайта, включите config.php и затем используйте SITE_ROOT константу везде, где хотите:
3. Проверьте свои пути включения
Другой способ включения файлов, ни относительный, ни абсолютный, — это полагаться на путь включения . Это часто бывает с библиотеками или фреймворками, такими как, например, Zend framework.
Подобное включение будет выглядеть так:
include «Zend/Mail/Protocol/Imap.php»
В этом случае вы должны убедиться, что папка, в которой находится «Zend», является частью пути включения.
Это можно проверить с помощью:
echo get_include_path();
Вы можете добавить в него папку с помощью:
set_include_path(get_include_path().»:».»/path/to/new/folder»);
4. Убедитесь, что у вашего сервера есть доступ к этому файлу
Может случиться так, что у пользователя, запускающего серверный процесс (Apache или PHP), просто нет разрешения на чтение или запись в этот файл.
Чтобы проверить, под каким пользователем запущен сервер, можно использовать posix_getpwuid :
$user = posix_getpwuid(posix_geteuid());
var_dump($user);
Чтобы узнать права доступа к файлу, введите в терминале следующую команду:
ls -l
5. Проверьте настройки PHP
- Если установлено, PHP не сможет получить доступ к любому файлу за пределами указанного каталога (даже через символическую ссылку).
- По умолчанию не устанавливается, и в этом случае ограничений нет.
- Можно проверить, вызвав phpinfo() или используя ini_get(«open_basedir») .
- Вы можете изменить настройку, отредактировав файл php.ini или файл httpd.conf.
- Е сли включено, могут быть ограничения. Однако данный режим был удален в PHP 5.4. Если вы все еще используете версию, которая поддерживает безопасный режим, обновитесь до версии PHP, которая это еще поддерживает .
- О тносится только к включению или открытию файлов через сетевой процесс, такой как http://, но не работает для локальной файловой системы.
- Э ти опции можно проверить, используя ini_get(«allow_url_include») или установи в с помощью ini_set(«allow_url_include», «1») .
- httpd_sys_content_t для файлов, которые ваш сервер может читать ;
- httpd_sys_rw_content_t для файлов, к которым необходимо дать доступ для чтения и записи ;
- httpd_log_t для файлов журнала ;
- httpd_cache_t для каталога к э ша .
- Этот пользователь владеет файлом и, возможно, родительским каталогом (особенно родительским каталогом, если вы хотите записывать файлы). В большинстве сред общего хостинга это не будет проблемой, потому что ваш пользователь должен владеть всеми файлами под вашим корневым каталогом.
- В Linux хорошей практикой будет использова ние chmod 600 (только владелец может читать и писать) или chmod 644 (владелец может писать, но все могут читать) .
Другие случаи
Если ничего из вышеперечисленного не помогло диагностировать проблему, могут возникнуть следующие особые ситуации:
1. Включение библиотеки на основе пути включения
Может случиться так, что вы подключаете библиотеку, например, платформу Zend, используя относительный или абсолютный путь. Например:
require «/usr/share/php/libzend-framework-php/Zend/Mail/Protocol/Imap.php»
Но по-прежнему получаете такую же ошибку.
Это могло произойти из-за того, что файл, который вы (успешно) включили, сам имеет оператор include для другого файла, и этот второй оператор include предполагает, что вы добавили путь этой библиотеки к пути включения.
Например, упомянутый ранее файл фреймворка Zend может включать следующее:
include «Zend/Mail/Protocol/Exception.php»
что не является включением ни по относительному пути, ни по абсолютному пути. Предполагается, что каталог фреймворка Zend был добавлен в путь включения.
В таком случае единственное практическое решение — добавить каталог в ваш путь включения.
2. SELinux
3. Symfony
Если вы используете Symfony и получаете эту ошибку при загрузке на сервер, возможно, к э ш приложения не был сброшен, либо потому, что app/cache был загружен, либо этот к э ш не был очищен.
Для этого надо выполнить следующую консольную команду:
cache:clear
4. Внутри Zip-файла символы, отличные от A SC II
По-видимому, эта ошибка может произойти также при вызове zip->close(), когда некоторые файлы внутри zip имеют в своем имени не-ASCII символы, такие как, например, «é».
Потенциальное решение — обернуть имя файла, используя utf8_decode(), перед созданием целевого файла.
Ответ 2
В дополнение к предыдущему ответу:
Программное обеспечение для виртуального хостинга
open_basedir может поставить вас в тупик, потому что его можно указать в конфигурации веб-сервера. Хотя это легко исправить, если вы запустите свой собственный выделенный сервер, существуют некоторые пакеты программного обеспечения для общего хостинга (например, Plesk, cPanel и т. д .), к оторые настраивают директиву конфигурации для каждого домена. Поскольку программное обеспечение создает файл конфигурации, вы не можете изменить этот файл напрямую, потому что программное обеспечение хостинга просто перезапишет его при перезапуске.
Plesk предоставляет возможность переопределить предоставленный httpd.conf , вызывая vhost.conf . Только администратор сервера может записать этот файл. Конфигурация для Apache выглядит примерно так :
php_admin_flag engine on
php_admin_flag safe_mode off
php_admin_value open_basedir «/var/www/vhosts/domain.com:/tmp:/usr/share/pear:/local/PEAR»
Попросите администратора сервера ознакомиться с руководством по используемому им хостингу и программному обеспечению веб-сервера.
Права доступа к файлам
Ответ 3
Samba Shares
Если у вас есть тестовый сервер Linux и вы работаете из клиента Windows, общий ресурс Samba мешает команде chmod . Даже если вы используете:
chmod -R 777 myfolder
со стороны Linux вполне возможно, что Unix Group\www-data все еще не будет иметь доступ на запись. Есть рабочее решение : если ваш общий ресурс настроен так, что администраторы Windows сопоставлены с корневым каталогом – в Windows откройте разрешения, отключите наследование для вашей папки с копией, а затем предоставьте полный доступ для www-данных.
Мы будем очень благодарны
если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.
PHP не может создать файл и записать данные
Здравствуйте. У меня проблема следующего характера: я пытаюсь создать текстовый файл и записать в него кое-какие данные из формы, но файл даже не создаётся. Что же это может быть? Пробовал даже на простейших примерах из сети создавать файл, ничего не происходит.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
html> HEAD> TITLE>ФАКУЛЬТЕТ2TITLE> style type="text/css"> #block1 width: 300px; height: 500px; background: yellow; position: absolute; } #block3 left: 800px; width: 300px; height: 500px; background: yellow; position: absolute; } .ob {background:blue} STYLE> script type="text/javascript"> function validate_form ( ) { valid = true; if ( document.contact_form.contact_name.value == "" ) { alert ( "Пожалуйста заполните поле 'Ваше имя'." ); valid = false; } return valid; } //--> script> HEAD> div id="block1"> form action=hello.php name="contact_form" method="post" onsubmit="return validate_form ( );"> p>Ваше имя: input type="text" name="contact_name">p> p>b>Название факультетаb>p> p>input name=Nazv[] type=radio value=math checked autofocus>Математическийp> p>input name=Nazv[] type=radio value=fiz>Физическийp> p>input name=Nazv[] type=radio value=mathfiz>Физико-математическийp> Специальности p>input type="checkbox" name=a[] value="prog">Программистp> p>input type="checkbox" name=a[] value="test">Тестировщикp> p>input type="checkbox" name=a[] value="sisadmin">Системный администраторp> button type="submit">img src="image2.jpg" width=70 height=30>button> $j = '1234567'; $fp = fopen("myfile1.txt", "wt"); fwrite($fp, $j); fclose($fp); ?> form> div> html>