Как сохранить файл XML на веб-сервере с помощью PHP?

Я новичок в PHP и ничего не знаю о манипулировании XML. Я работаю над XML-аннотацией Google CSE, показанной ниже:

  <?xml version="1.0" encoding="UTF-8" ?> 
- <Annotations>
- <Annotation about="http://sanspace.in/">
  <Label name="_cse_byxamvbyjpc" /> 
  </Annotation>
- <Annotation about="http://blog.sanspace.in/">
  <Label name="_cse_byxamvbyjpc" /> 
  </Annotation>
- <Annotation about="http://google.com/">
  <Label name="_cse_exclude_byxamvbyjpc" /> 
  </Annotation>
  </Annotations>

Я хочу добиться этого из показанного выше файла:

  <?xml version="1.0" encoding="UTF-8" ?> 
- <Annotations>
- <Annotation about="http://sanspace.in/">
  <Label name="testString1" /> 
  </Annotation>
- <Annotation about="http://blog.sanspace.in/">
  <Label name="testString2" /> 
  </Annotation>
- <Annotation about="http://google.com/">
  <Label name="testString2" /> 
  </Annotation>
  </Annotations>

До сих пор я пробовал:

<?php
if (file_exists('test.xml'))
  {
  $xml = simplexml_load_file('test.xml');
  }
else
  {
  exit('Error.');
  }
foreach($xml->Annotation as $annotation)
    {
    if ($annotation["about"]=="http://sanspace.in/") 
        {  $annotation->Label["name"]="testString1";  } 
    else 
        {  $annotation->Label["name"]="testString2";  } } 

$dom = new DOMDocument('1.0'); 
$dom->preserveWhiteSpace = false; 
$dom->formatOutput = true; 
$dom->loadXML($xml->asXML()); 
echo $dom->saveXML();
$dom->save("test.xml");
?> 

Этот код выполняет задачу, но не сохраняет ее в файл.

Мой вопрос: что не так с оператором $dom->save("test.xml");? Как сохранить файл XML на сервере?


person San    schedule 28.07.2010    source источник
comment
@Гордон, отредактировал вопрос.   -  person San    schedule 28.07.2010
comment
@San, за исключением отсутствующих скобок во втором операторе if, это работает? Есть ошибки?   -  person Gordon    schedule 28.07.2010
comment
@ Гордон, я добавил скобки. Нет никаких изменений. Я просто получаю пустую страницу, когда я вызываю этот файл через браузер. Файл test.xml находится в том же каталоге, где находится эта php-страница. Я делаю что-то не так?   -  person San    schedule 28.07.2010
comment
@San, посмотри на исходный код страницы. Тоже пусто? Если это так, включите error_reporting(-1); и убедитесь, что в вашем php.ini включены display_errors и display_startup_errors. Затем перезагрузите страницу, чтобы увидеть, выдает ли она какие-либо ошибки.   -  person Gordon    schedule 28.07.2010
comment
@ Гордон Это пусто. Однако в этом файле нет ничего, кроме php-кода. Таким образом, он будет пустым, даже если он работает нормально. Это правильно? Я понял вашу мысль об ошибках. Но я не знаю, где включить отчет об ошибках и где будет находиться php.ini. Я использую cPanel и PHP5 (надеюсь).   -  person San    schedule 28.07.2010
comment
@San Да, если вы ничего не выведете, то оно будет пустым — вы добавляете error_reporting(-1) в качестве вызова функции поверх своих скриптов. Настройки ini можно включить через ini_set.   -  person Gordon    schedule 28.07.2010
comment
@Gordon Создал файл php.ini в том же каталоге и добавил в него error_reporting = E_ALL display_errors = 1 display_startup_errors = 1. Будет ли это делать?   -  person San    schedule 28.07.2010
comment
@Гордон добавил error_reporting(-1);. Тем не менее я получаю ту же пустую страницу. XML остается прежним. Должен ли я использовать какой-либо класс XMLWriter для редактирования файла xml?   -  person San    schedule 28.07.2010
comment
@Попробуйте Нет, вы используете us2.php.net/manual/en/simplexmlelement. asXML.php   -  person Gordon    schedule 28.07.2010
comment
@Gordon Изменил код. Работает, но файл не сохраняет. Как сохранить файл XML?   -  person San    schedule 02.08.2010


Ответы (2)


Я не вижу ничего плохого в вашем коде. Я думаю, у вас проблема с разрешением.

PHP работает как один из следующих двух пользователей:

  • nobody или, возможно, www-data (он же системный пользователь, которого использует веб-сервер)
  • Ваш логин

Чтобы PHP работал от имени пользователя, которому принадлежит корень веб-сайта (т. е. вы), для PHP должен быть включен suexec. Тот факт, что вы не можете писать в файл с правами 0644, говорит о том, что это не так.

У вас есть два варианта:

  • Перенастройте сервер, чтобы PHP работал от имени пользователя, которому принадлежит корень веб-сайта.
  • Сделать файловый мир доступным для записи

Я настоятельно рекомендую первый над вторым. Однако не всегда у вас есть такой выбор. Если ваш хост (или системный администратор, или кто-то еще) не может или не хочет включать suexec для PHP, вам придется предоставить файлу права доступа 0777, также известные как rwxrwxrwx.

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

person Tim Post♦    schedule 04.08.2010
comment
Тим, я не знаю, как настроить suexec. Буду стараться. Ничего, если у меня 777? Означает ли это отсутствие безопасности? - person San; 05.08.2010

В $dom->save("test.xml"); нет ничего плохого.
Однако вам не нужно делать сохранение в DOM. С тем же успехом можно было бы сделать это с SimpleXML:

$xml->saveXML("test.xml");

Убедитесь, что папка назначения доступна для записи. Используйте абсолютный путь, чтобы убедиться, что вы действительно ищете файл в нужном месте.

person Gordon    schedule 02.08.2010
comment
Я пробовал это. Но никакого эффекта. Разрешение XML — rw-r--r--. Это нормально? - person San; 02.08.2010
comment
@San, если веб-сервер является владельцем файла, да. Если нет, также установите права группы на w. Если веб-сервер не является владельцем и не входит в группу владельцев файлов, chmod владелец веб-сервера. - person Gordon; 02.08.2010
comment
Гордон, я попробовал первый, и он не сработал. Я не знаю, как сменить владельца. Как я понимаю, проблема не в коде. Это просто мое отсутствие знаний, как редактировать файл на сервере. Я очень ценю вашу постоянную поддержку. - person San; 03.08.2010
comment
@San должны быть ошибки, если файл недоступен для записи. Я почти уверен, что вы просто что-то упускаете из виду. - person Gordon; 03.08.2010
comment
Гордон, наконец-то я получил это, изменив права доступа к файлам на 777. Спасибо за постоянную поддержку. Это было действительно очень полезно на каждом этапе. - person San; 05.08.2010
comment
@San, вы никогда не должны устанавливать для любого общедоступного ресурса значение 777. Это делает его доступным для записи всем. Я намеренно убрал этот параметр разрешений в пользу смены владельца. - person Gordon; 05.08.2010
comment
@ Гордон Но у меня нет другого пути. На этом сервере только один пользователь. Как сменить владельца? - person San; 05.08.2010
comment
@San, если это сервер *nix, вы должны использовать chmod. На вашем веб-сервере есть пользователь и группа. Один из способов узнать, что это такое, — создать файл с помощью PHP. - person Gordon; 05.08.2010