За последние 24 часа нас посетили 44696 программистов и 6982 робота. Сейчас ищут 1349 программистов ...

Почему не создаётся файл?

Тема в разделе "PHP для новичков", создана пользователем tmpnik, 14 май 2026 в 06:52.

  1. tmpnik

    tmpnik Активный пользователь

    С нами с:
    21 мар 2011
    Сообщения:
    56
    Симпатии:
    0
    Здравствуйте, есть сайт на древней
    CMS, в файл index.php ввожу код
    Код (Text):
    1. $data = __DIR__.'\\';
    2. $file = __DIR__.'\example.txt';
    3. $result = file_put_contents($file, $data);
    4. echo __DIR__.'\\';
    5. exit;
    Всё нормально отрабатывает, файл в каталоге(windows) появляется.
    Убираю код, обновляю сайт, выдаёт ошибку в такой то программе, в такой то строке перед continue
    Но мне нужна не только код ошибки, но и много других переменных, которые я хотел бы записать в файл. Но для этого хотя бы понять почему нет записи в файл.
    Т.е. я этот вышеприведённый код, вставляю перед строкой(перед continue), в которой вышла ошибка, но файл не создаётся. Любая абракадабра(фыафываы) на мониторе не появляется. Как сделать запись в файл ?
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.840
    Симпатии:
    1.338
    Адрес:
    Лень
    сначала вылечи ошибки потом переходи за другое.
     
  3. tmpnik

    tmpnik Активный пользователь

    С нами с:
    21 мар 2011
    Сообщения:
    56
    Симпатии:
    0
    Причём тут ошибки?, я могу не идти по этой ветки, а выбрать другую, которая работает без ошибок, и вставить в вызываемую функцию этот код, результат будет тот же, файл не создаётся.. и хотелось бы вначале понять причину, где что перехватывается.
     
  4. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.840
    Симпатии:
    1.338
    Адрес:
    Лень
     
  5. tmpnik

    tmpnik Активный пользователь

    С нами с:
    21 мар 2011
    Сообщения:
    56
    Симпатии:
    0
    Мне надо создать новую тему?, заменив строку "Убираю код, обновляю сайт, выдаёт ошибку в такой то программе, в такой то строке перед continue" на строку "Вставляю код в вызываемую функцию, которая находится в другом программном файле, обновляю сайт, текстовик не создаётся."
     
  6. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.840
    Симпатии:
    1.338
    Адрес:
    Лень
    Разберём ситуацию по порядку. То, что вы описываете, указывает на одну из трёх типовых проблем в PHP: **скрипт не доходит до вашего кода**, **ошибка парсинга**, либо **CMS блокирует вывод/запись**.

    ### Почему ваш код не срабатывает в проблемном месте?
    1. **Ошибка происходит раньше или является фатальной**. Если PHP встречает `Fatal error` или `Parse error`, выполнение немедленно останавливается. Код, который вы вставили перед ошибкой, просто не выполняется.
    2. **Ошибка синтаксиса (Parse error)**. Если в файле есть синтаксическая ошибка (например, `continue` вне цикла, незакрытая скобка, опечатка), PHP **не компилирует файл вообще**. В этом случае ни один ваш `echo` или `file_put_contents` не отработает.
    3. **Буферизация вывода или кастомный обработчик ошибок**. Старые CMS часто используют `ob_start()`, `set_error_handler()` или собственные роутеры, которые подавляют `echo` и перенаправляют вывод.
    4. **Пути с обратным слешем**. `__DIR__.'\example.txt'` на Windows обычно работает, но в некоторых конфигурациях PHP интерпретирует `\` как экранирование. Лучше использовать `DIRECTORY_SEPARATOR` или прямой слеш `/`.

    ---

    ### ✅ Что сделать в первую очередь? (Пошагово)

    #### 1. Включите логирование ошибок PHP
    Добавьте **в самые первые строки** `index.php` (до любого кода CMS):
    ```php
    ini_set('display_errors', 1);
    ini_set('display_startup_errors', 1);
    error_reporting(E_ALL);
    ```
    Обновите страницу. Вы увидите **точный текст ошибки и стек вызовов**. Это ключ к пониманию, почему скрипт падает.

    #### 2. Проверьте, доходит ли выполнение до вашего кода
    Вместо `file_put_contents` используйте `error_log()`. Он пишет в системный лог PHP даже при частичном падении скрипта и не зависит от прав на запись в веб-директории:
    ```php
    error_log("DEBUG: Дошли до строки X. Переменная: " . print_r($myVar, true));
    ```
    Посмотрите лог: `php_errors.log` (обычно в `php.ini` `error_log = "..."`) или в панели хостинга.

    #### 3. Надёжный способ записи в файл (если `error_log` недоступен)
    ```php
    $logFile = __DIR__ . '/debug.log';
    $message = date('Y-m-d H:i:s') . ' | ' . print_r($yourVars, true) . PHP_EOL;
    file_put_contents($logFile, $message, FILE_APPEND | LOCK_EX);
    ```
    `FILE_APPEND` не перезаписывает, а добавляет.
    `LOCK_EX` предотвращает конфликты при одновременных запросах.
    Используйте `/` вместо `\\` для путей.

    #### 4. Убедитесь, что файл вообще парсится
    Если после добавления `ini_set('display_errors', 1)` вы видите **белый экран** или ошибку `Parse error`, значит, в файле есть синтаксическая проблема. В этом случае:
    - Проверьте парность скобок `{}`, `()`, `[]`
    - Убедитесь, что `continue` находится строго внутри `foreach`, `for`, `while` или `do...while`
    - В PHP 8+ `continue` вне цикла вызывает `Fatal error`, в старых версиях тоже, но может маскироваться CMS

    ---

    ### Практический алгоритм отладки
    1. Откройте `index.php`, добавьте в начало:
    ```php
    error_log('INDEX.PHP STARTED');
    ini_set('display_errors', 1); error_reporting(E_ALL);
    ```
    2. Обновите сайт → смотрите `php_errors.log` или экран.
    3. Найдите точный файл и строку ошибки из лога (часто CMS загружает файл через `include/require`, и ошибка не в `index.php`, а в подключаемом шаблоне/модуле).
    4. В проблемном файле перед ошибкой вставьте:
    ```php
    error_log('DEBUG REACHED BEFORE LINE ' . __LINE__);
    ```
    5. Если лог появляется → скрипт доходит, проблема в правах/пути/буферизации.
    Если лога нет → ошибка парсинга или скрипт падает раньше.
     
    tmpnik нравится это.
  7. tmpnik

    tmpnik Активный пользователь

    С нами с:
    21 мар 2011
    Сообщения:
    56
    Симпатии:
    0
    Спасибо, буду разбираться с ответом, но
    ".. Старые CMS часто используют `ob_start()`,"
    это действительно так
     
  8. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    947
    Симпатии:
    147
    ТС, кстати, завязывай с обратными слэшами в путях, это виндовая проприетарщина, используй прямые, они работают везде.