Возможно ли получить контент URL с PHP (используя какую-то функцию, например file_get_contents
или header
), но только после выполнения какого-либо кода JavaScript?
Пример:
mysite.com имеет скрипт, который выполняет loadUrlAfterJavascriptExec('http://exampletogetcontent.com/')
и печатает / перекликается с контентом. представьте, что некоторые jQuery запускаются на http://exampletogetcontent.com/
что изменяет DOM, а loadUrlAfterJavascriptExec
получит полученный HTML- loadUrlAfterJavascriptExec
Можем ли мы это сделать?
Чтобы быть ясным, я хочу, чтобы содержимое страницы отображалось по URL-адресу, но только после того, как JavaScript запускается на целевой странице (один PHP получает его содержимое).
Мне известно, что PHP работает до того, как страница будет отправлена клиенту, а JS – только после этого, но подумал, что, возможно, существует экспертное решение.
Обновление 2 Добавляет более подробную информацию о том, как использовать phantomjs
из PHP.
Обновление 1 (после выяснения того, что javascript на целевой странице нужно запустить в первую очередь)
1. Загрузите phantomjs и поместите исполняемый файл в путь, к которому может обратиться ваш двоичный файл PHP.
2. Разместите следующие 2 файла в одном каталоге:
получить-website.php
<?php $phantom_script= dirname(__FILE__). '/get-website.js'; $response = exec ('phantomjs ' . $phantom_script); echo htmlspecialchars($response); ?>
получить-website.js
var webPage = require('webpage'); var page = webPage.create(); page.open('http://google.com/', function(status) { console.log(page.content); phantom.exit(); });
3. Просмотрите сайт get-website.php
и целевой сайт, содержимое http://google.com
вернется после выполнения встроенного javascript. Вы также можете вызвать это из командной строки, используя php /path/to/get-website.php
.
/get-website.php
<?php $html=file_get_contents('http://google.com'); echo $html; ?>
test.html
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>on demo</title> <style> p { color: red; } span { color: blue; } </style> <script src="https://code.jquery.com/jquery-1.10.2.js"></script> </head> <body> <button id='click_me'>Click me</button> <span style="display:none;"></span> <script> $( "#click_me" ).click(function () { $.get("/get-website.php", function(data) { var json = { html: JSON.stringify(data), delay: 1 }; alert(json.html); }); }); </script> </body> </html>
Все PHP запускается до отправки информации клиенту. Все JavaScript запускается после отправки информации клиенту.
Чтобы сделать что-то с PHP после загрузки страницы, страница должна будет либо
Поскольку данные, как представляется, находятся в другом файле, чем ваш PHP, это довольно хорошее решение. Поскольку вы отметили его jQuery, я предполагаю, что вы его используете.
jQuery имеет набор страниц о том, как он реализует Ajax
Но самый простой способ использования jQuery для этого – .post
например:
$.post( "http://example.com/myDataFile.txt", function( data ) { //do more JavaScript stuff with the data you just retrieved });
$.post()
, как следует из названия, может отправлять данные вместе с запросом на файл данных, поэтому, если этот запрос является, скажем, файлом PHP, файл PHP может использовать эти данные.
например:
$.post( "http://example.com/myDataFile.txt", { foo: "bar"; yabba: "dabba" }, function( data ) { //do more JavaScript stuff with the data you just retrieved });
данные должны быть в формате JSON в парах ключ / значение.