Linux include не работает

Обновлено: 03.07.2024

Оператор include() подключает и вычисляет специфицированный файл.

Нижеследующая документация применима также к require() . Эти две конструкции идентичны во всём, кроме обработки облома. include() выводит Warning!, а require() выдаёт Fatal Error. Иначе говоря, используйте require() , если вы хотите, чтобы отсутствие файла останавливало процессинг страницы. include() не работает таким образом, скрипт продолжит выполнение. Не забудьте также о соответствующей установке include_path.

Когда файл подключён/included, содержащийся в нём код наследует область видимости переменной строки, на которой возникло подключение. Любые переменные, доступные на этой строке в вызывающем файле, будут доступны в вызываемом файле, вперёд от этой точки.

Пример 11-3. Базовый пример include()

Если подключение возникает внутри функции в вызывающем файле, то весь код, содержащийся во включаемом файле, будет работать так, как если бы он был определён внутри. Так что он будет следовать области видимости переменной.

Пример 11-4. Подключение внутри функций

Когда файл подключается, разбор переходит из режима PHP в режим HTML в начале целевого файла и вновь продолжает после конца. Исходя из этого, любой код внутри файла назначения, который должен выполняться как PHP-код, обязан быть заключён в правильные стартовый и конечный тэги РНР.

Предупреждение!

Windows-версия PHP в настоящее время не поддерживает доступ к удалённым файлам с помощью этой функции, даже если allow_url_fopen включена.

Поскольку include() и require() являются специальными конструкциями языка, вы обязаны заключить их в блок операторов, если это внутри условного блока.

Пример 11-6. include() и условные блоки

Обработка возвращает: можно выполнить оператор return() внутри подключённого файла, чтобы прервать обработку этого файла и возвратиться в скрипт, вызвавший его. Также можно возвращать значения из подключённых файлов. Вы можете принять значение вызова include как обычно.

Примечание: в PHP 3 возвращаемое значение может не появиться внутри блока, если это не блок функции; в этом случае return() применяется к этой функции, а не ко всему файлу.

Пример 11-7. include() и оператор return()

$bar имеет значение 1 , поскольку подключение было успешным. Обратите внимание на отличия в примерах. Первый использует return() внутри подключённого файла, а другие - нет.

Другие способы "подключения" файлов в переменные имеются при помощи fopen() , file() или путём использования include() вместе с Функциями управления выводом.

Когда функциия вызывается в том же файле, где расположена- работает нормально. Но стоит только вынести её в отдельный файл, а потом включить этот файл с include, require и т.п., функция сразу перестаёт работать.

В чём может быть проблема? .

может траблы с глобальными и локальными переменными? такое бывает. вообще опиши подробно как он "не работает" а лучше запости код Originally posted by gufy
может траблы с глобальными и локальными переменными? такое бывает. вообще опиши подробно как он "не работает" а лучше запости код

Глобальных переменных не использую.

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

запускается, броузер выводит чистый экран.

include ( "file1.php" ) ;
//include_once("file1.php");

if ( $condition ) <
fnc_update ( "teacher" , $_POST [ "teacher_id" ] , array ( "login" , "paswd" ) , array ( $_POST [ "login" ] , md5 ( $_POST [ "paswd" ] ) ) ) ;
>

а если функция задекларирована в этом же файле, то все работает /без инклуда/? попробуй в конце кода функции перед последним ">" поставить return 0; Originally posted by gufy
а если функция задекларирована в этом же файле, то все работает /без инклуда/? попробуй в конце кода функции перед последним ">" поставить return 0;

Если функция определена в том же файле- всё работает.

Вставка return 0; не помогла.

то есть ты не понимаешь не работает инклюд или функция?
разрули постепенно
файл инклюдится, ато была бы ошибка
значин не пашет функция
напиши перед кодом функции просто

fnc_update($table, $id, $fields, $values) echo "OK";exit;

и посмотри вызывается ли она вообще. Если вызывается смотри код если нет смотри вызов :)

fnc_update(1,2,3,4);
если опять ОК не выскочит вырубай комп, отдыхай, а потом со свежими силами ищи по новой)))

Все manual'ы по include давно прочитала. В файле нет синтаксических ошибок.

Пробовала закоментировать содержимое функции- всё равно, когда запускается функция, перестаёт работать весь скрипт.

чудес-то не бывает:) проверила наличие открывающих/закрывающих тегов в начале и конце файла?
совет: пойди поспи,Ю завтра свежим взглядом найдешь ляп:)) Originally posted by Nadezda

Пробовала закоментировать содержимое функции- всё равно, когда запускается функция, перестаёт работать весь скрипт.


мистика :)
попробуй развести массив и запрос
то есть не передвай array() прямо в вызове функции
а сначала создай $x = array() а потом уже fnc_update($x)
если понимаешь о чем я. думаю ошибка там(в вызове)
разделяй и влавствуй :)

всё верно, LD 100.
Вот такой код:

<?php
$db_name = 'testing' ;
$db_user = 'user1' ;
$db_pass = 'passwd2' ;
$db_loc = 'localhost' ;
mysql_connect ( $db_loc , $db_user , $db_pass ) ;
?>

я столкнулся с проблемой. В логах сервера увидел вот это:

PHP Fatal error: Call to undefined function mysql_connect ( ) in / usr / www / smthg / html / config.php on line 6

в браузере вывод ошибок выключен.

<?php
$db_name = 'testing' ;
$db_user = 'user1' ;
$db_pass = 'passwd2' ;
$db_loc = 'localhost' ;
$connect = array ( mysql_connect ) ;
mysql_connect ( $db_loc , $db_user , $db_pass ) ;
?>

необходимо было сначала определить переменную, что бы вывести массив.
Проблем то ли в настройках php то ли в версии php

В PHP скриптах, вызывая include() , require() , fopen() или их производные, такие как include_once , require_once или даже move_uploaded_file() , часто появляются ошибки или предупреждения:

Не удалось открыть поток: нет такого файла или каталога.

Как быстро найти первопричину проблемы?

Ответ 1

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

Предположим, у нас есть следующая строка:

require "/path/to/file"

Контрольный список

1. Проверьте путь к файлу на предмет опечаток

  • проверьте вручную (визуально проверив путь) ;

  • переместите все, что вызывается с помощью require* или include* в переменную, скопируйте ее и попробуйте получить к ней доступ с терминала:

2. Убедитесь, что путь к файлу правильный с точки зрения относительного и абсолютного пути

  • если он начинается с косой черты "/", то это относится не к корню папки вашего веб-сайта (корень документа), а к корню вашего сервер :

    • например, каталог вашего веб-сайта может быть /users/tony/htdocs ;

    • не относительно пути к корню вашего веб-сайта или файла ;

    • или всегда используйте абсолютные пути к файлам .

    1. используйте require __DIR__."/relative/path/from/current/file" , который возвращает каталог текущего файла ;

    2. определите 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 <path/to/file>

    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") .

    Другие случаи

    Если ничего из вышеперечисленного не помогло диагностировать проблему, могут возникнуть следующие особые ситуации:

    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

    В дополнение к предыдущему ответу:

    Программное обеспечение для виртуального хостинга

    Права доступа к файлам

    1. Этот пользователь владеет файлом и, возможно, родительским каталогом (особенно родительским каталогом, если вы хотите записывать файлы). В большинстве сред общего хостинга это не будет проблемой, потому что ваш пользователь должен владеть всеми файлами под вашим корневым каталогом.

    2. В Linux хорошей практикой будет использова ние chmod 600 (только владелец может читать и писать) или chmod 644 (владелец может писать, но все могут читать) .

    Ответ 3

    Samba Shares

    Если у вас есть тестовый сервер Linux и вы работаете из клиента Windows, общий ресурс Samba мешает команде chmod . Даже если вы используете:

    chmod -R 777 myfolder

    со стороны Linux вполне возможно, что Unix Group\www-data все еще не будет иметь доступ на запись. Есть рабочее решение : если ваш общий ресурс настроен так, что администраторы Windows сопоставлены с корневым каталогом – в Windows откройте разрешения, отключите наследование для вашей папки с копией, а затем предоставьте полный доступ для www-данных.

    Мы будем очень благодарны

    если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.

    Одна из самых занимательных и полезных возможностей php - подключение другого файла. Например, на сайте есть верхнее меню, нижнее и между ними само содержание страницы. И, например, на 10 страницах сайта используется нижнее меню. В какой-то момент в него потребовалось внести изменения. В html Вы бы вручную в каждом отдельном файле вносили изменения, но php позволяет существенно упростить работу с сайтом! Код нижнего меню может содержаться в отдельном файле, а на каждой из 10-ти страниц можно просто подключать этот отдельный файл! То есть все изменения нужно теперь вносить только в файл с меню, а на 10-ти других оно будет отображаться уже с изменениями.

    Смысл подключения в php простым русским языком:

    Файл 1.php
    Верхнее меню

    Файл 2.php
    Нижнее меню

    Файл example.php
    Подкючаем Файл 1.php
    Содержание страницы
    Подкючаем Файл 2.php

    В результате проработки файла example.php будет отображено
    Верхнее меню
    Содержание страницы
    Нижнее меню
    Соответственно, чтобы что-либо изменить в нижнем меню, нужно внести изменения только в файле 2.php

    Путь к файлу

    Подключение файла происходит согласно указанному к файлу пути. Есть два варианта пути: относительный и абсолютный. Относительный - это указание пути к подлючаемому файлу относительно файла с инструкцией подключения. Абсолютный - указание полного пути к подключаемому файла.

    Код PHP

    include и include_once

    include() - конструкция, предназначенная для включения файлов в код сценария PHP во время исполнения сценария PHP. При обработке кода инструкция заменяется на содержимое присоединяемого файла. Предлагаю сразу рассмотреть пример.

    Рассмотрим работу include на примере двух файлов: index.php и text.php. Для простоты работы допустим, что они лежат в одной директории.

    Код PHP (файл index.php)


    Код PHP (файл text.php)


    В результате работы файла index.php отобразится:

    Обычный текст, содержащийся в основном файле
    Текст, содержащийся в подключаемом файле
    Правда удобно? Теперь, поменяв содержимое в файле text.php будет совершенно другой результат работы index.php!

    Код PHP

    require и require_once

    Инструкции require и require_once работают идентично include и include_once за исключением лишь одной особенности - в случае того, если подключаемый файл не будет найден, выполнение скрипта будет остановлено (сценарий дальше не будет считываться), в то время как include и include_once просто выводят предупреждение и продолжают дальнейшее выполнение скрипта.

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

    Если не работает include или require

    Чтобы понять причины того, почему не работает include, предлагаю проверить всё по шагам. Какими бы понятными и поверхностными не были указанные ниже пункты, проверьте всё с самого начала

    1. Проверьте, работает ли Ваш сервер и php, работает ли вообще любой php код на сайте
    2. Убедитесь, существует ли файл подключаемый файл
    3. Проверьте, правильно ли введено название файла и расширение в подключении
    4. Убедитесь, что подключаемый php-файл действительно находится по тому адресу, по которому указали
    5. Попробуйте указать не относительный путь, а абсолютный (полный путь к файлу).

    Пример Код PHP

    6. Если у Вас не подключается файл и не отображается никакой ошибки, то в директории с файлом, который подключаете, создайте файл .htaccess со следующим содержимым


    или в файле php, перед подключением, вставьте следующую строку

    Читайте также: