Можно ли запустить файл PHP с HTML на сервере

Обычно, когда у вас есть файл .PHP и клиент запрашивает его, код PHP запускается на сервере, а HTML и JavaScript отправляются клиенту.

Вопрос

Возможно ли, чтобы сервер запрашивал веб-страницу (локальную) и запускал на сервере как код PHP, так и код HTML с JavaScript? Я создал один файл .html, который после 3 секунд обработки локально создает данные изображения для миниатюры данного видео.

Почему

Мне нужно создать миниатюру для видео. Я использовал виртуальный хостинг, и мой хостинг-провайдер не поддерживает ffmpeg. Однако вы можете создавать миниатюры, используя canvas и JavaScript. Я уже оказал большое давление на клиента. Если это возможно, время загрузки и выгрузки будет значительно меньше, чем при использовании клиента.

Попытки

Я пытался использовать file_get_contents(), но он не запускает код (имеет смысл). Есть ли способ открыть его и запустить в течение x секунд, а затем получить содержимое?

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

Моей последней попыткой было использовать new DOMDocument(). Я даже не смог загрузить страницу. Во-первых, я не могу разобрать его с тегом video. Это дает эту ошибку:

Warning: DOMDocument::load(): Specification mandates value for attribute controls in 
file:\path\to\html\document.html, line: 53 in C:\path\to\php\document.php on line 50

Если бы я удалил тег видео (что необходимо), я получил бы ошибки при синтаксическом анализе моего JavaScript. Так что и эта попытка не удалась.


Можно ли заставить PHP обрабатывать код (для чего-то на сервере) в течение x секунд, прежде чем получить содержимое? Это даст время для создания миниатюрных данных. Если есть другой способ сделать это без использования ffmpeg на сервере, это было бы здорово.


person Jack    schedule 04.04.2020    source источник
comment
Взгляните на stackoverflow.com/questions/21179522/. Надеюсь, это поможет.   -  person Deepak    schedule 04.04.2020
comment
@Дипак, спасибо! Это то, что я делаю в настоящее время. Я просто ищу способ запустить этот скрипт на сервере вместо того, чтобы запускать его на клиенте, чтобы сократить время передачи файлов и нагрузку на клиента.   -  person Jack    schedule 04.04.2020
comment
То, что я предлагаю, конечно, не очень хорошая идея, но вы не рассматривали возможность использования чего-то вроде скрытого iframe? Например, рассмотрим вход в Google. Открывается страница, и вы выполняете вход в систему, и она где-то сохраняется, и вы получаете от нее ответ с помощью API, и теперь вы можете сделать что-то подобное, используя скрытый iframe.   -  person Mohsen Nemati    schedule 04.04.2020
comment
@MohsenNemati, хорошо, я об этом не подумал. Куда вы предлагали это поставить? Когда пользователь-администратор отправляет видео? Или когда видео показывается обычному пользователю? Пользователь-администратор в моем случае практически не может выполнять какую-либо обработку на стороне клиента, что действительно ограничивает меня.   -  person Jack    schedule 04.04.2020
comment
Я объясню это как ответ.   -  person Mohsen Nemati    schedule 05.04.2020


Ответы (2)


Итак, как я уже упоминал в комментариях, то, что я собираюсь объяснить, — это просто вариант (не самый лучший и просто отвечающий на вашу потребность в запуске html-кода!)

Где это сделать?

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

<iframe id="myIframe" style="display: none;"></iframe>

Как начать процесс?

Я не знаю, как вы загружаете видео (и это действительно не так важно!), но давайте предположим, что вы хотите использовать formdata. После того, как видео загружено, вам нужно знать что-то уникальное для обращения к видео (скажем, идентификатор). Таким образом, после загрузки видео мы можем получить код типа id:20, initiateThumbnail:true в качестве данных результата json. Затем мы можем просто использовать этот скрытый iframe в качестве браузера, о котором вы просили, например:

$("#myIframe").attr("src","dothething.php?video=20");

Теперь делайте то, что вы когда-либо хотели сделать в нем, и измените его содержимое после того, как это будет сделано. Теперь нужно дождаться результата!

$('#myIframe').load(()=>{
    let result = $("#myIframe").contents();
    // checking result!
});

Как вы уже подумали, любые ошибки можно обработать, обработав результат.

Примечания

  1. Слушатель событий, который мы использовали для iframe (iframe.load), также срабатывает, когда вы инициируете создание миниатюры. Так что будьте осторожны с процессом проверки результата (содержимого этого iframe!)
  2. Если вы не используете ajax или formdata, просто действие вашей формы — это то, что я использовал как iframe.
  3. Один вопрос? Что произойдет, если сетевое соединение прервется во время этого процесса? Простой ответ! Вы можете проверить очень многими способами, существует ли миниатюра или нет. Если нет, вы можете создать его один раз, когда пользователь запросит его в своем браузере, загрузить его обратно на сервер и сохранить навсегда (как вы сделали это в панели администратора!)
person Mohsen Nemati    schedule 05.04.2020
comment
Спасибо за ваш ответ, чем это будет отличаться от простого включения dothething.php на страницу? Начнет ли он новый поток из-за iframe? Извините за поздний ответ, я не видел, чтобы ТАК уведомлял меня. - person Jack; 06.04.2020
comment
@Jack dothething.php отвечает за создание эскиза. Концепция того, что я объяснил, важна, и на основе того, как работают ваши коды, вы можете спроектировать структуру. Например, если вам нужна некоторая информация с сервера для редактирования каждого видео, вы должны либо использовать iframe для загрузки данных каждый раз, либо использовать ajax для получения этих данных (лично я выбираю ajax). Если нет, вы правы, используя iframe не нужно. - person Mohsen Nemati; 06.04.2020

Я думаю, что нет другого способа создать миниатюру на php-сервере, кроме как с помощью ffmpeg. Единственное, что вы можете сделать, я полагаю, это принудительно генерировать холст при загрузке страницы, если вы еще этого не сделали.

В любом случае вы пытаетесь сделать что-то не так. Php не оценивает html-код, это просто препроцессор, а не интерпретатор, как браузер. Вы можете ждать все время мира, но вы никогда не получите содержимое изображения, которое сгенерирует только браузер.

person Matteo Gallinucci    schedule 04.04.2020
comment
Да, это я правильно делаю. И именно этого я боялся. - person Jack; 04.04.2020