Когда и где работает JavaScript, как насчет PHP? Могу ли я объединить два?

Когда работает язык на стороне клиента, например JavaScript, и когда на нем работает серверный язык, например PHP? Как я могу смешивать оба?

Я хочу запустить функцию PHP при нажатии кнопки на моем сайте или запустить функцию JavaScript из PHP; возможно?

Ответ 1

Короткий ответ Нет. Вы не можете запускать функции PHP из JavaScript [За исключением AJAX] а также не можете запускать функции JavaScript из PHP. Два времени выполнения являются отдельными.

Как?

Чтобы понять, как взаимодействуют JavaScript и PHP, вы должны сначала понять основы HTTP-протокола, который поддерживает сеть.

HTTP Sequence

На приведенной выше диаграмме демонстрируются основы протокола HTTP. Пользователь (вы) просит клиента (вашего браузера) получить вам страницу. Затем браузер запросит сервер (Google, в этом примере) для этой страницы. Сервер будет отвечать HTML-страницей, клиент анализирует эту страницу и запрашивает изображения, шрифты и любые другие ресурсы, необходимые для правильной загрузки страницы. Затем клиент представляет заполненную страницу пользователю.

Итак, где находится JavaScript?

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

Sequence with JavaScript

JavaScript-скрипты запускаются, как только они загружаются, и будут продолжать выполняться, если у них есть слушатели событий, ожидающие событий от пользователя (например, щелчок, ввод текста или перемещение).

Где находится PHP?

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

Обновленная диаграмма:

Sequence with JavaScript and PHP

Как вы можете видеть, выполнение PHP не сохраняется. Он выполняется, а затем заканчивается после отправки ответа.


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

Но.. но.. Я слышал об AJAX!

AJAX просто вызывает другой HTTP-запрос из JavaScript. Вы можете назвать это способом использования PHP-функций из JavaScript, но на самом деле это не совсем так.

AJAX Sequence

Как вы можете видеть, с AJAX JavaScript отправит запрос на сервер, который вызовет PHP, PHP снова запустится, как в обычном запросе (PHP не обязательно знает, что это даже запрос AJAX!), и сервер возвращает ответ обратно на JavaScript, который использует его для работы.

В этом случае существует совпадение между временем выполнения PHP и временем выполнения JavaScript, поскольку JavaScript вызывал запрос.

Также см.:

Ответ 2

Добро пожаловать в McBurger, причудливый (да, правый) гамбургер. Запах высохшего жир вторгается в ваши ноздри, заставляя кишечник рыться в смеси отвращение и восторг. Вы терпеливо ждете в очереди за матерью того, что должно быть человеческими детьми. Наконец, вы встречаете подросткового кассира лицом к лицу, а не без сожаления. Вы заказываете гамбургер (сюрприз) и картошку. Вы платите и подождите немного для вашего заказа.

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

Чем это связано?

Ангелов-кассир - сервер, возможно, работает php.

Вы клиент, возможно, веб-браузер, способный понимать html/css/js.

Чтобы получить услугу, вы подходите к стойке и говорите: "Я хочу гамбургер". McBurger затем готовит и дает вам гамбургер.

Чтобы получить услугу, веб-браузер подходит к серверу и говорит "Я хочу эту страницу". Затем ваш сервер готовит и предоставляет вам страницу.

Важнейшим аспектом этого является отсутствие смешения клиентов и McBurger. Вы не будете готовить картофель-фри, и Мак-Бургер не будет пить молочный коктейль. Точно так же веб-браузер не будет запускать php, а сервер будет не запускайте javascript для вас. Если вы хотите, чтобы МакБургер дал вам свою знаменитую карамель мороженое, вы должны подойти к стойке и попросить ее. Если вы хотите, чтобы ваша веб-страница чтобы сохранить что-то в БД при нажатии кнопки, вы должны подойти к серверу и попросите его сделать это.

Ты и МакБургер обмениваетесь звуком. Браузеры и серверы обмениваются данными через HTTP.

Посмотрим на HTTP.

Кролик, куда вы меня взяли?

Если вы используете почти любой дистрибутив Linux или Mac, у вас установлен netcat. Если вы в Windows, извините, вам придется взять слово за следующий раздел или загрузить порт nc или telnet-клиент.

В любом случае, откройте свой любимый терминал и поговорите с каким-то сервером на порту 80 (порт http по умолчанию):

% nc www.stackoverflow.com 80

"Уолп, это ничего не значило, там просто пустое приглашение передо мной!"

Не волнуйтесь, случайный человек, с которым я общаюсь во время этих ответов, мы просто ничего не сказали серверу! В McBurger это было бы эквивалентом ходьбы до стойки и пристально глядящим на кассира.

Просто.

зырящая.

Мы должны быстро использовать наши голосовые связки, или они вызовут безопасность. Я не могу вернуться к этой адской маре Марте, я просто... не могу.

... Anywho, нам нужно сказать кассиру, что мы хотим гамбургер. В http, выдающем запрос GET:

% nc www.stackoverflow.com 80
GET / HTTP/1.1

Нажмите дважды, и ура, мы получили какой-то результат!

HTTP/1.1 400 Bad Request
Content-Type: text/html; charset=us-ascii
Date: Sat, 02 Aug 2014 10:55:16 GMT
Content-Length: 334

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD><TITLE>Bad Request</TITLE>
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
<BODY><h2>Bad Request - Invalid Hostname</h2>
<hr><p>HTTP Error 400. The request hostname is invalid.</p>
</BODY></HTML>

Это не может быть хорошо. Множество вещей, которые я не понимаю, но это говорит о том, что имя хоста запроса недействительно. Попробуем это снова, только мы дадим ему хозяин на этот раз:

% nc www.stackoverflow.com 80
GET / HTTP/1.1
Host: stackoverflow.com

Нажмите дважды, и "святой байесус, это много выходных!". Да, это так.

Кролик, как это важно?

Итак, как это связано с php и некоторыми блок-схемами? Все еще думаете, что вы можете запустить php на клик? Давайте напишем "привет мир" в php и посмотрим, почему это невозможно.

Просто для случая, я установил php и написал несколько файлов:

# example.php
<?php
echo 'Hi mom!';
?>

Прохладный, позвольте сделать запрос и посмотреть, что происходит:

% nc localhost 80
GET /example.php HTTP/1.1
Host: localhost

Ритуальные два введите ключи и:

HTTP/1.1 200 OK
Server: nginx/1.2.1
Date: Sat, 02 Aug 2014 11:00:52 GMT
Content-Type: text/html

Hi mom!

Поздравляем, у нас есть собственный бургер! У нас есть сервер, на который мы можем отвечать клиентам! Радость миру!

Здесь произошел этот разговор:

  • Me: Дайте мне /example.php.
  • Сервер: хорошо. Привет, php, запустите example.php
  • php: Что бы ни случилось. Выходной сигнал Hi mom!
  • Сервер: там вы идете клиент, Hi mom!
  • Я: Спасибо!

В заключение

  • Сервер и клиент - это два отдельных существа.
  • Они обмениваются сообщениями по HTTP.
  • Если клиент чего-то хочет, он должен запросить у него сервер.
    • Что он делает, выполняя HTTP-запросы.

Бесстыдная самореклама: если вы хотите знать, как создавать HTTP-запросы из javascript, вы можете обратиться к моей сути по этому вопросу ( предупреждение: содержит следы ругательных слов).

Ответ 3

Другой ответ велик, но я просто попробую более простой подход.

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

Браузер получает страницу, и если на странице есть какой-либо Javascript, или есть теги SCRIPT, которые тянут другие файлы .js, он читает все это, а затем выполняет Javascript.

Таким образом, ваша страница "построена" PHP, и она может включать Javascript в это как-то, что будет выполняться браузером, но эти два процесса обычно являются отдельными.

Вы можете заставить PHP "поговорить" с Javascript, выведя конкретный код JS на страницу.

Вы можете заставить Javascript "поговорить" с PHP, используя AJAX для связи с сервером во время выполнения страницы. Сервер может предоставить ответную информацию обратной связи, которая затем снова интегрируется на страницу с помощью Javascript.

Но, как правило, эти два процесса работают в своих собственных мирах.

Вы можете сделать "кнопка запуска PHP-кода" лучше всего с AJAX.

Запуск Javascript из "внутри" PHP на самом деле не сделан.