php와 웹 브라우저

익명 사용자의 이미지

아래는 동료의 이메일에서 인용한 것인데, 저로서는 이해가 되지 않아서 좀 이해해 보려고 질문을 드리게 되었습니다.

"I have a bunch of php code that interacts with a MySQL database. I am not running a webserver but use a browser to invoke php scripts."

제가 이해하기로는 php는 프로그래밍 언어고 실행하기 위해서는 인터프리터가 필요합니다. 웹 서버는 그 인터프리터를 부르는 가장 흔한 클라이언트구요. 웹 서버 없이도 php 커맨드 라인 툴로 인터프리터를 부를 수도 있다고 생각합니다.

찾아보면 볼수록 웹브라우저는 php 인터프리터를 실행하도록 만들어지지 않았다는 얘기만 나오는 것 같습니다. 동료는 웹서버 없이 브라우저를 통해서 MySQL DB를 조작하는 php 코드를 수행하고 있다고 얘기하는 것 같습니다.

첫째, 이게 가능한가요, 아니면 동료가 어딘가에 웹서버가 있는데 그걸 모르고 있나요?

두번째 질문은 웹 서버와 웹 브라우저의 차이는, php 의존관계라는 관점에서 보면 무엇이냐는 것입니다.

같은 동료는 위의 인용을 바탕으로 php가 웹브라우저에 의존한다고 주장합니다. php와 웹 서비스에 필요한 스택이 설치되었으나 웹브라우저도 X server도 설치되지 않은 서버를 셋팅도 해보고 상상도 할 수 있는 저로서는 별로 납득이 가지 않는 주장입니다. 실제로 웹 브라우저를 의존관계에 넣는 리눅스 배포판을 본 적도 없고요.

다만 레드햇 계열 php 패키지는 흔히 웹 서버(httpd)를 의존관계에 포함합니다. 무슨 차이인가요? 단순히 웹 서버가 php 인터프리터를 부르는 가장 널리 쓰이는 클라이언트이기 때문인가요? 아니면 php 인터프리터 구현 자체가 웹 서버와 밀접하게 맞물려 있는 부분이 있는지요?

swish95의 이미지

위의 인용구만으로는 정보가 부족하지만 브라우져에서 접속한다고 해서 웹서버가 있어야 한다는 의미는 아니죠
인용구에 있는 작업은 소켓 통신으로 해당 내용을 수신해서 php 를 수행하면 끝나는 일이고 별도의 프로그래밍 없이 php 인터프리터만 가지고 수행할수는 없습니다.

단순 소켓으로 http 규격만 충족하면 라이트한 웹서버를 구성할수 있는데 이렇게 만든걸 웹서버라고 한다면 또 틀린말은 아니지만 php 인터프리터가 이 작업을 수행하는건 아니니까요

아마도 동료분이 간과하시는게 웹서버가 단순히 우리가 알고 있는 아파치, 톰캣 같은 웹서버가 아니라서 오해하시는듯도 하네요

------------------------------------------------------------
ProgrammingHolic

글쓴이의 이미지

아직도 이해가 잘 되지 않는 부분이 있습니다.

https://www.w3schools.com/php/php_mysql_connect.asp

위의 링크에 가보니 MySQL 서버에 연결하고 DB를 생성하는 등의 일을 하는 php 코드 예제가 나와 있습니다. 이야기를 쉽게 하기 위해 /home/kldp/my.php라는 파일에 이런 비슷한 내용이 들어 있다고 가정하겠습니다.

 <?php
$servername = "localhost";
$username = "username";
$password = "password";
 
// Create connection
$conn = new mysqli($servername, $username, $password);
 
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}
echo "Connected successfully";
?> 

php 커맨드 라인 툴과 php 코드가 들어 있는 my.php가 있으면 MySQL 서버에 접근, DB를 생성하거나 DB로부터 필요한 정보를 얻어오거나 할 수 있는 것 같아 보입니다.

제가 이해가 안 되는 건, 커맨드라인 툴이 아니라 굳이 웹브라우저로 웹 서버가 없는 데도 my.php를 수행하여 MySQL 서버를 컨트롤하는 게 가능한가 하는 점입니다. 예컨대 주소창에 /home/kldp/my.php 라고 타이핑하고 엔터를 치면, MySQL 서버를 컨트롤하는 게 웹서버 없이 가능한지 모르겠습니다.

답변해 주신 내용을 나름대로 이해해 보자면, my.php 안의 텍스트를 읽고 그걸 php 인터프리터한테 전달해 줄 간단한 프로그램--예컨대 python이든 C++이든 JAVA로든 쓰여진--만 있다면 웹브라우저가 없어도 MySQL 서버를 php 코드를 통해 접근하는 게 가능하다는 말씀 같습니다. 커맨드라인 툴이 하는 게 정확히 그런 일일 테구요. 그런데 이런 일을 커맨드라인 툴 대신 웹브라우저에 파일 로케이션 타이핑 해 넣어서 처리하는데 이게 로컬 웹서버 없이 가능한가요?

swish95의 이미지

잘 아시다시피 커맨드 라인 툴은 그냥 PHP 코드를 번역해서 해당 결과
그러니 까 위에 코드에서는 "Connection ~~~" 관련 내용을 echo 로 보내주는 역할만 하고 있습니다.

위의 코드 어디에도 http 로 들어온 요청에 대한 처리에 대한 부분이 없습니다.
브라우져를 통한다면 웹서버나, 소캣 처리 같은 부분이 있어야 할것이고 그렇지 않다면 실행을 하게 해주는 다른 스크립트가 있어야 겠죠
그런 처리를 PHP CLI 가 할수 있는지 잠깐 검색해 보았는데 그런부분은 당연히 없어 보입니다.

PHP CLI 가 있는 목적은 PHP 를 다른 쉡 프로그램처럼 사용할수 있게 하는데 목적이 있는데 웹서버가 왜 언급되는지 모르겠습니다.^^

ps: "웹브라우저가 없어도 MySQL 서버를 php 코드를 통해 접근하는 게 가능"
=> 이부분은 "일반적인 웹서버(아파치, 톰캣, NodeJS..) 없이도 웹브라우저를 통해 MySQL 서버를 php 코드를 통해 접근하는 게 가능" 이 맞는 말 같네요

------------------------------------------------------------
ProgrammingHolic

swish95의 이미지

PHP Code 로 소켓 통신도 가능하니까 PHP 로 웹서버를 대신할수는 있겠네요
그러니까 웹서버를 대신할 프로그램을 PHP 로 만들어서 CLI 로 구동해서 Socket 을 기다리게 할수 있다는 말입니다.
Socket 을 열고 요청이 들어오면 해당 연결을 열어서 입력된 URL 에 해당하는 파일을 번역해서 처리해서 반환하는 로직의 프로그램을 만들수 있다는 말이죠
그렇게 되면 CLI 를 통해서 "PHP 웹서버를 구동한다" 라고 해야 옳은 표현일겁니다.

최종적으로는 웹서버를 PHP 로 만든건데 그렇다고 CLI 가 웹서버를 대신한다고 하기는 그렇죠..

물론 제가 직접 해본건 아닙니다. ^^

------------------------------------------------------------
ProgrammingHolic

글쓴이의 이미지

사실 그 동료가 여태 5년 사이 경험한 사람들 중에 가장 협조적인(반의적인 의미에서요) 사람입니다. 이따금은 다른 데도 아니고 실리콘 밸리에서 이렇게 대놓고 인종차별이라도 하나 싶은 지경이예요.

한 2천 라인 짜리 저 혼자 3, 4일 짜서 같이 쓰고 있는 파이썬 코드가 있는데, 그 동료가 C밖에 모를 것 같아서 친절하게 Makefile을 래퍼로 붙여줬습니다. make XXX 하면 XXX가 파이썬 코드로 넘어가고 XXX라는 이름의 모듈을 로드한 다음에 비슷한 연산을 수행하게끔 되어 있는데, 모듈 이름에 오타를 냈더군요. 파이썬은 그런 모듈이 없다면서 stack frame을 보여주고 죽었는데, 저한테 메일을 보내서 화를 내면서 왜 안 되냐고 하다가 오타라니까 오타가 나면 메이크 파일 수준에서 체크를 해야 된다고 하더군요.

이 동료 때문에 안 해도 될 일을 그간 몇 차례 했는데, 오늘은 php의 의존관계로 웹 브라우저를 넣어야 되고, 웹브라우저는 X server가 있어야 하며, 그러므로 클라우드 시스템에 들어가는, free tier 리소스에서 돌아갈 이미지에는 php를 넣을 수 없다고 주장하더군요.

저희 팀은 GNU 툴 체인 팀인데(대부분이 C나 C++로 되어 있고 응용 프로그램도 대개 C나 C++로 되어 있습니다) php를 잘 모르지만 뭔가 말이 안 되는 것 같아서 질문을 시작하게 되었습니다. 감사합니다.

swish95의 이미지

틀렸으면 인정하면 될걸 MakeFile 운운하는걸 봐서는 뭔가 지식에 대한 자신감보다 약간 자존감이 앞서는 동료로 보이네요.
"모른다" 병보다 무서운게 "다 안다" 병이라는데 그게 걸린게 아닌가 싶습니다. ㅋㅋ

님 덕분에 저도 맨날 같은 코드에 같은 레퍼런스만 보다가 환기가 되는 기회가 되어서 좋네요 ^^

------------------------------------------------------------
ProgrammingHolic

김정균의 이미지

PHP 분 아니라, perl, python, ruby 등과 같은 interpreter language 는 web server module 또는 cgi, fastcgi 와 같은 방식으로 웹서버와 연계되어 동작을 합니다. 그러므로 배포본에서 의존성을 걸어 놓습니다. 특히 PHP의 경우 apache web server 에 embeding 이 될 수있도록 지원을 하기 때문에 apache module 로 빌드된 php package 는 apache package에 의존성을 걸게 됩니다. 이게 일단 웹서버와의 관계 입니다.

그리고 브라우저와 PHP의 관계는 동료분이 설명하는 것은 좀 어폐가 있습니다. 브라우저는 웹서버에서 전달해 주는 데이터를 randering 해서 보여줄 뿐, 실제 PHP가 실행이 되는 것은 server 에서 실행이 됩니다. 브라우저는 server에서 동작할 수도 있지만 대부분은 사용자의 PC나 mobile 장비에서 구동이 됩니다.

그렇다면 브라우저는 꼭 웹서버와 통신을 하는가.. 는 요즘은 그렇지 않습니다. 요즘의 브라우저들은 web socket 이라는 기능을 제공하기 때문에 http protocol 이 아니어도 통신이 가능 합니다. 그러므로 server 는 반드시 web server 이어야 할 필요는 없습니다.

그리고 PHP는 web server 에 연결된 상태 (embed module 이거나 cgi 또는 fastcgi 또는 WAS) 로 구동이 되지만, PHP 자체로 listening 을 하게 socket daemon 을 만들 수 있습니다. 아니면 PHP로 웹서버를 구현할 수도 있습니다. 즉 web server에 의존적이지는 않다는 얘기입니다.

즉 PHP이든지 python 이든지 ruby 든지 java 든지.. 상상할 수 있는 만큼 다양하게 사용이 가능 합니다. 무언가 꼭 필요하다고 한다면, 그 사람은 그만큼 밖에 모른다는 것이 되겠죠.

글쓴이의 이미지

웹서버와 php RPM 사이의 관계는 이제 좀더 잘 이해가 되었습니다. 브라우저에 관한 설명도 감사합니다.

마지막에서 두 번째 문단은 아직도 잘 이해가 되지 않는 부분이 있습니다. 보통 C, C++의 경우 아마도 runtime에 dynamic linked library 정도가 필요할 것 같고, Java의 경우 JVM이 필요하겠지만, 어느 경우에나 딱히 어떤 종류의 서버를 전제하고 실행되는 모델은 아닌 것으로 이해됩니다. php는 혹시 이 부분에서 다른 언어들과 차이가 있나요? "Web server에 연결된 상태로 구동이 되지만"이라고 하신 부분이 이해가 안 되어서요. 그 나머지 부분에서 말씀하신 내용들은 서버를 어떻게 구현할 것이냐에 관한 것 같은데, Python, Java, C/C++ 등과는 달리 php는 실행되는 과정에서 서버가 꼭 개입되나요?

익명 사용자의 이미지

김정균님이 말씀하신대로 php는 서버가 꼭 필요 없습니다.
심지어 쉘에서도 php script를 실행 할 수 있습니다
(간단한 스크립트 짤때는 perl / python 보다 편해요)

김정균의 이미지

너무 어렵게 생각하시는 것 같습니다. 서버라는 개념을 서로 다르게 바라보고 있는 것 같은데요. 그리고 python 을 잘 하시는 것 같아 python 으로 비교를 하자면, python 으로 하듯이 php로 하시면 된다는 얘기입니다. 어떤 language 를 잘 이해하고 계신지는 모르겠지만 interpreter 아니면 compile language 든간에 잘 다루실 수 있는 언어랑 동일하게 사용할 수 있다고 보시면 됩니다. 단 interpreter language 라면 해당 코드를 실행시켜줄 php , pythyon, java 등이 필요하게 되겠죠.

php 가 web server 랑 자꾸 붙어 다니는 이유는 php 라는 interpreter 를 별도의 binary 가 아니라 libphp.so 라는 apache module 로 제공을 해 주기 때문입니다. 그래서 php 를 apache 에서만 사용가능한 언어라고 생각 하는 사람들도 더러 있습니다.

python code 를 실행 할 때,

/usr/bin/python test.py

와 같이 하듯이 php 도

/usr/bin/php test.php

로 실행할 수 있다는 얘기입니다. test.php 코드가 http protocol 을 처리할 수 있는 코드라면 위와 같이 실행을 한다면 php 로 만든 웹서버를 구동했다는 의미가 될 수도 있다는 얘기입니다.

글쓴이의 이미지

익명사용자님과 김정균님 답변 감사합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.