Как сохранить 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-файл на сервере?

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

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

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

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

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

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

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

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

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

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

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