<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ranieri Valença</title>
    <description>The latest articles on DEV Community by Ranieri Valença (@ranierivalenca).</description>
    <link>https://dev.to/ranierivalenca</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F934047%2F519d831e-6de5-469a-91ea-bcc79659ce41.png</url>
      <title>DEV Community: Ranieri Valença</title>
      <link>https://dev.to/ranierivalenca</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ranierivalenca"/>
    <language>en</language>
    <item>
      <title>Criando e executando um projeto Laravel 12 com (quase) zero dependências usando Docker</title>
      <dc:creator>Ranieri Valença</dc:creator>
      <pubDate>Fri, 28 Feb 2025 18:13:19 +0000</pubDate>
      <link>https://dev.to/ranierivalenca/criando-e-executando-um-projeto-laravel-12-com-quase-zero-dependencias-usando-docker-hgd</link>
      <guid>https://dev.to/ranierivalenca/criando-e-executando-um-projeto-laravel-12-com-quase-zero-dependencias-usando-docker-hgd</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;O objetivo deste artigo é criar e executar um projeto Laravel 12 sem instalar nenhuma dependência no sistema host. Para isso, criei um &lt;strong&gt;Dockerfile&lt;/strong&gt; baseado na imagem oficial do PHP com o Composer e o Bun. Você pode ir direto para a seção Dockerfile se estiver com pressa.&lt;/p&gt;

&lt;p&gt;Uma &lt;em&gt;side quest&lt;/em&gt; é instalar a extensão do MongoDB para PHP. Você pode ir direto para a seção Expandindo o Dockerfile e dependências para ver como fiz isso.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Como professor de Desenvolvimento Web, em geral tenho que lidar com muitos ambientes, linguagens e frameworks diferentes. Muitas vezes tenho que instalar binários, bibliotecas e dependências no sistema para poder rodar um simples "Hello World". Isso não só consome tempo, mas também pode causar conflitos entre diferentes versões da mesma biblioteca ou binário.&lt;/p&gt;

&lt;p&gt;Como sou ~um pouco~ desorganizado, em geral eu esqueço de desinstalar essas dependências e binários depois de terminar meu trabalho. Isso deixa muito lixo no sistema, o que pode deixá-lo mais lento e, mais uma vez, gerar muitos conflitos.&lt;/p&gt;

&lt;p&gt;Ontem me deparei com um novo desafio em um projeto de alguns estudantes: eles queriam criar um projeto Laravel 12 no laboratório da faculdade, mas não tinham permissão para instalar nada no sistema. Além disso, a versão do PHP instalada no laboratório estava desatualizada (para o Laravel 12) e seria trabalhoso atualizar. Para completar, eles queriam conectar o Laravel a um banco de dados MongoDB – que também não estava instalado.&lt;/p&gt;

&lt;p&gt;Então, propus um desafio: criar um projeto Laravel 12 sem instalar nenhuma dependência. E agora estou compartilhando esse desafio com você — junto com a minha solução.&lt;/p&gt;

&lt;p&gt;Neste artigo, apresentarei meu fluxo de trabalho para atingir esse objetivo. Vou compartilhar meus pensamentos e decisões, os problemas que enfrentei e como os resolvi. Até porque além de ser um desenvolvedor &lt;strong&gt;bem&lt;/strong&gt; apaixonado pelo que faço, também sou professor, então tentarei explicar tudo de uma forma mais simples e leve. Espero que goste!&lt;/p&gt;

&lt;h2&gt;
  
  
  O processo
&lt;/h2&gt;

&lt;p&gt;Depois de algumas considerações, a solução que encontrei foi usar o &lt;strong&gt;Docker&lt;/strong&gt; para criar um contêiner com todas as dependências necessárias para rodar um projeto Laravel 12. Dessa forma, podemos criar um projeto Laravel dentro do contêiner e executá-lo sem instalar nada no sistema host, ou simplesmente usar o contêiner como um ambiente de desenvolvimento e (meio que) rodar o projeto no sistema host.&lt;/p&gt;

&lt;p&gt;Claro, dava pra obter o mesmo resultado usando uma máquina virtual, mas o &lt;strong&gt;Docker é mais rápido e leve&lt;/strong&gt;. Também (provavelmente) tinha como usar ambientes virtuais (virtual environments), mas eles seriam menos diretos e mais complexos. Além disso, ou eles não funcionariam no laboratório da faculdade ou os alunos iriam deixar o ambiente virtual rodando indefinidamente, criando problemas para outros alunos (às vezes menos experientes), o que iria criar mais dor de cabeça.&lt;/p&gt;

&lt;p&gt;Voltando à ideia de usar o &lt;strong&gt;Docker&lt;/strong&gt;, parece ser um pouco desafiador no início, porque os &lt;a href="https://laravel.com/docs/12.x/installation#creating-a-laravel-project" rel="noopener noreferrer"&gt;requisitos do Laravel 12&lt;/a&gt; são: PHP, Composer, o &lt;strong&gt;Laravel Installer&lt;/strong&gt; (um binário que hoje em dia eu normalmente evito instalar no sistema) e Node + NPM (ou &lt;a href="https://bun.sh" rel="noopener noreferrer"&gt;Bun&lt;/a&gt; (?)). Há alguns outros requisitos que eles não mencionam, mas falaremos sobre isso mais tarde.&lt;/p&gt;

&lt;p&gt;Sempre que preciso rodar algo em um contêiner Docker, eu procuro no &lt;a href="https://hub.docker.com" rel="noopener noreferrer"&gt;Docker Hub oficial&lt;/a&gt; por uma imagem que já tenha as dependências de que preciso. Também prefiro usar imagens oficiais porque:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Eu confio mais nelas.&lt;/li&gt;
&lt;li&gt;Elas geralmente estão mais atualizadas.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Para o desafio proposto e levando em conta minhas preferências pessoais, encontrei as seguintes imagens:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://hub.docker.com/_/php" rel="noopener noreferrer"&gt;PHP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hub.docker.com/_/composer" rel="noopener noreferrer"&gt;Composer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hub.docker.com/_/node" rel="noopener noreferrer"&gt;Node&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cada uma delas tem uma imagem oficial no Docker Hub, mas não foram feitas para serem usadas juntas. Então, eu tenho que criar um &lt;strong&gt;Dockerfile&lt;/strong&gt; personalizado para gerar um contêiner com todas as dependências necessárias. E agora eu tenho que decidir qual delas usar como base para facilitar o trabalho.&lt;/p&gt;

&lt;p&gt;Atualmente, a imagem &lt;code&gt;latest&lt;/code&gt; do Composer &lt;a href="https://hub.docker.com/layers/library/composer/latest/images/sha256-6d0765ae33c7a3aa26688a1d61dcd46880896a4ed07a874073b7dcadae4930ac" rel="noopener noreferrer"&gt;é baseada&lt;/a&gt; no &lt;a href="https://www.alpinelinux.org" rel="noopener noreferrer"&gt;Alpine Linux&lt;/a&gt;, que é &lt;strong&gt;muito minimalista e leve&lt;/strong&gt;, mas exigiria que eu instalasse &lt;strong&gt;PHP e Node manualmente&lt;/strong&gt;. Já as imagens do &lt;strong&gt;Node e do PHP são baseadas no Debian&lt;/strong&gt; (que é minha zona de conforto). Então, decidi usar a imagem do &lt;strong&gt;PHP&lt;/strong&gt; como base para meu &lt;strong&gt;Dockerfile&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prova de conceito
&lt;/h2&gt;

&lt;p&gt;Eu invejo aquelas pessoas que conseguem diretamente escrever um &lt;strong&gt;Dockerfile&lt;/strong&gt; sem testar nada no mundo real — pessoas que realmente &lt;em&gt;sabem&lt;/em&gt; o que estão fazendo e quais comandos e pacotes precisam. &lt;strong&gt;Eu não sou uma dessas pessoas.&lt;/strong&gt; Então, antes de ir para o &lt;strong&gt;Dockerfile&lt;/strong&gt;, decidi criar um contêiner com a imagem PHP e tentar instalar o &lt;strong&gt;Composer&lt;/strong&gt; e o &lt;strong&gt;Bun&lt;/strong&gt; manualmente.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; php bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Esse comando vai criar um contêiner com a imagem PHP e executar o comando &lt;code&gt;bash&lt;/code&gt; dentro dele. O parâmetro &lt;code&gt;--rm&lt;/code&gt; vai remover o contêiner assim que ele for encerrado. Assim, posso testar as coisas sem deixar lixo (contêiners parados) no meu sistema.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Composer
&lt;/h3&gt;

&lt;p&gt;Beleza, agora estou dentro do contêiner. Vamos tentar &lt;a href="https://getcomposer.org/download/" rel="noopener noreferrer"&gt;instalar o Composer&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s2"&gt;"copy('https://getcomposer.org/installer', 'composer-setup.php');"&lt;/span&gt;
php composer-setup.php
php &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s2"&gt;"unlink('composer-setup.php');"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Funcionou! Agora só falta um comando para mover o arquivo &lt;code&gt;composer.phar&lt;/code&gt; para o diretório &lt;code&gt;/usr/local/bin&lt;/code&gt; e torná-lo disponível &lt;em&gt;globalmente&lt;/em&gt; (não no meu sistema, mas no contêiner).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mv &lt;/span&gt;composer.phar /usr/local/bin/composer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Bun
&lt;/h3&gt;

&lt;p&gt;Ótimo. Agora, para aumentar um pouco o desafio, vamos tentar instalar o &lt;a href="https://bun.sh" rel="noopener noreferrer"&gt;Bun&lt;/a&gt; — um gerenciador de pacotes alternativo ao Node.js. Não sei se vai funcionar, mas vamos tentar.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://bun.sh/install | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;😒!&lt;/strong&gt; O Bun precisa do &lt;code&gt;unzip&lt;/code&gt;, que não está instalado no contêiner. Vamos instalar.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apt-get update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; unzip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora, de volta à instalação do &lt;strong&gt;Bun&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://bun.sh/install | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Funcionou! Só mais um comando que o Bun pediu para rodar, e está instalado.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;source&lt;/span&gt; /root/.bashrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Na verdade, ele já estava instalado, mas para que funcionasse na sessão atual do shell, eu tive que rodar esse comando para recarregar o arquivo &lt;code&gt;.bashrc&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Agora vamos testar se &lt;strong&gt;tudo está funcionando até agora&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer &lt;span class="nt"&gt;--version&lt;/span&gt;
bun &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Lindo!&lt;/strong&gt; 🎉 Agora podemos criar um projeto Laravel, conforme recomendado pela &lt;a href="https://laravel.com/docs/12.x/installation#installing-php" rel="noopener noreferrer"&gt;documentação oficial&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer global require laravel/installer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Esse comando instalará o Laravel Installer globalmente, para que possamos executá-lo de qualquer lugar.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ok, agora, o próximo passo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;laravel new example-app
&lt;span class="c"&gt;# bash: laravel: command not found&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://www.destroyallsoftware.com/talks/wat" rel="noopener noreferrer"&gt;Wat&lt;/a&gt;? Isso não estava no plano. Por que isso está acontecendo? Vamos tentar descobrir.&lt;/p&gt;

&lt;p&gt;De acordo com a &lt;a href="https://getcomposer.org/doc/03-cli.md#global" rel="noopener noreferrer"&gt;documentação do Composer&lt;/a&gt;, o comando &lt;code&gt;composer global&lt;/code&gt; que acabei de rodar instala pacotes no diretório &lt;code&gt;COMPOSER_HOME&lt;/code&gt;. Vamos verificar isso.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$COMPOSER_HOME&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ah, ótimo - não tem a variável de ambiente &lt;code&gt;COMPOSER_HOME&lt;/code&gt;. Vamos voltar para a &lt;a href="https://getcomposer.org/doc/03-cli.md#composer-home" rel="noopener noreferrer"&gt;documentação do Composer&lt;/a&gt; e ver o que ela diz. Ah, certo, por padrão ela é &lt;code&gt;~/.composer&lt;/code&gt;. Vamos verificar.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; ~/.composer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bom, tem um diretório &lt;code&gt;vendor&lt;/code&gt; lá, e ao verificá-lo (&lt;code&gt;ls -la ~/.composer/vendor&lt;/code&gt;) eu vejo um diretório &lt;code&gt;Laravel&lt;/code&gt; e um diretório &lt;code&gt;bin&lt;/code&gt; dentro dele. Vamos dar uma olhada no diretório &lt;code&gt;bin&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; ~/.composer/vendor/bin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hmm, lá está um arquivo executável chamado &lt;code&gt;laravel&lt;/code&gt;. Vamos tentar rodá-lo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;~/.composer/vendor/bin/laravel  &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Funcionou! Agora preciso adicionar o diretório &lt;code&gt;~/.composer/vendor/bin&lt;/code&gt; à variável de ambiente &lt;code&gt;PATH&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;:/root/.composer/vendor/bin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Outra forma de acessar o executável &lt;code&gt;laravel&lt;/code&gt; é pelo comando &lt;a href="https://getcomposer.org/doc/03-cli.md#exec" rel="noopener noreferrer"&gt;Composer exec&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer global &lt;span class="nb"&gt;exec &lt;/span&gt;laravel &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora posso (com sorte) criar um projeto Laravel.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;laravel new my-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O processo de criação de um projeto Laravel agora faz umas perguntas a mais do que antes (já faz mais de um ano desde o meu último projeto Laravel), mas (meio que) funcionou. No final do processo, ele perguntou se eu queria rodar &lt;code&gt;npm install&lt;/code&gt; e &lt;code&gt;npm run dev&lt;/code&gt;. Eu disse "sim", mas falhou porque optei por usar Bun e ele não tem o &lt;code&gt;npm&lt;/code&gt; instalado.&lt;/p&gt;

&lt;p&gt;O projeto Bun parece promissor (essa é a minha primeira vez usando), mas o Laravel ainda parece otimizado para Node.js e NPM. Vou tentar instalar as dependências usando Bun.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;my-app
bun i &lt;span class="c"&gt;# ou bun install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bem, funcionou. Não tenho certeza se essa abordagem funcionará para todos os projetos Laravel. Mas, por enquanto, estou feliz com os resultados.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E... não. Parece que a versão 12 do Laravel está no meio de uma migração do método "antigo" com &lt;code&gt;php artisan ...&lt;/code&gt; para os scripts do Composer (até porque dentro destes scripts ele ainda roda o &lt;code&gt;php artisan&lt;/code&gt;) e, embora sugira Bun como uma alternativa ao Node.js+NPM, ainda usa scripts NPM. O último comando falhou porque ele tentou rodar &lt;code&gt;npx ...&lt;/code&gt; e recebi um erro &lt;code&gt;sh: 1: npx: not found&lt;/code&gt;. Que pena.&lt;/p&gt;

&lt;p&gt;Agora tenho algumas opções aqui:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Instalar Node.js e &lt;code&gt;npx&lt;/code&gt; neste contêiner.
&lt;/li&gt;
&lt;li&gt;Mudar o projeto Laravel para usar Bun em vez de NPM.
&lt;/li&gt;
&lt;li&gt;Descobrir qual é o substituto do Bun para &lt;code&gt;npx&lt;/code&gt; e usá-lo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vou optar pela última. A &lt;a href="https://bun.sh/docs/cli/bunx" rel="noopener noreferrer"&gt;documentação do Bun CLI apresenta &lt;code&gt;bunx&lt;/code&gt; ou &lt;code&gt;bun x&lt;/code&gt; como substituto do &lt;code&gt;npx&lt;/code&gt;&lt;/a&gt;. Verificando a origem do &lt;code&gt;bunx&lt;/code&gt; dentro do contêiner (&lt;code&gt;which bunx&lt;/code&gt;) e listando (&lt;code&gt;ls -la $(which bunx)&lt;/code&gt;), posso ver que é um &lt;strong&gt;symlink&lt;/strong&gt; para o executável &lt;code&gt;bun&lt;/code&gt;. Então, vamos tentar criar outro &lt;strong&gt;symlink&lt;/strong&gt; para ele, chamado — você adivinhou — &lt;code&gt;npx&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;which bunx&lt;span class="si"&gt;)&lt;/span&gt; /usr/local/bin/npx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora vamos tentar rodar o comando &lt;code&gt;composer run dev&lt;/code&gt; novamente.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E funcionou! Bem, pelo menos o comando &lt;code&gt;npx&lt;/code&gt; funcionou. Agora recebi uma exceção PHP pedindo pela extensão &lt;code&gt;pcntl&lt;/code&gt;. Felizmente, escolhi a imagem do PHP como base — diretamente da visão geral dela (&lt;a href="https://hub.docker.com/_/php" rel="noopener noreferrer"&gt;https://hub.docker.com/_/php&lt;/a&gt;) temos "Como instalar mais extensões PHP" (como eu queria que todas as imagens tivessem esse tipo de documentação). Vamos tentar instalar a extensão que falta.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker-php-ext-install pcntl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E agora posso tentar novamente.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E funcionou! Agora eu tenho um projeto Laravel 12 rodando em um contêiner com &lt;strong&gt;zero dependências instaladas no meu sistema&lt;/strong&gt;. Estou feliz com os resultados até agora. Também estou feliz com todos os passos que tomei para chegar até aqui. Agora, vamos para o próximo passo e criar um Dockerfile para automatizar todos esses passos.&lt;/p&gt;

&lt;h3&gt;
  
  
  O Dockerfile
&lt;/h3&gt;

&lt;p&gt;Agora me sinto confiante o suficiente para criar um &lt;strong&gt;Dockerfile&lt;/strong&gt; para automatizar todos esses passos. Vamos criar um arquivo chamado &lt;code&gt;Dockerfile&lt;/code&gt; (&lt;code&gt;touch Dockerfile&lt;/code&gt; se você estiver em um sistema Unix (Linux ou MacOS), ou &lt;code&gt;type nul &amp;gt; Dockerfile&lt;/code&gt; se você estiver no Windows) e colar o seguinte conteúdo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; php:latest&lt;/span&gt;

&lt;span class="c"&gt;# Instalar unzip&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; unzip

&lt;span class="c"&gt;# Instalar Composer de outra forma, mas com o mesmo resultado&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;curl &lt;span class="nt"&gt;-sS&lt;/span&gt; https://getcomposer.org/installer | php &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--install-dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/local/bin &lt;span class="nt"&gt;--filename&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;composer

&lt;span class="c"&gt;# Configurar as variáveis de ambiente&lt;/span&gt;
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; HOME="/root"&lt;/span&gt;
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; PATH="/root/.composer/vendor/bin:${PATH}:/root/.bun/bin"&lt;/span&gt;

&lt;span class="c"&gt;# Instalar Bun&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://bun.sh/install | bash

&lt;span class="c"&gt;# Criar alguns symlinks para o executável bun&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nb"&gt;ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;which bun&lt;span class="si"&gt;)&lt;/span&gt; /usr/local/bin/npm
&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nb"&gt;ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;which bunx&lt;span class="si"&gt;)&lt;/span&gt; /usr/local/bin/npx

&lt;span class="c"&gt;# Instalar o Laravel Installer&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;composer global require laravel/installer

&lt;span class="c"&gt;# Instalar a extensão pcntl&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;docker-php-ext-install pcntl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora vamos construir a imagem.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker build &lt;span class="nt"&gt;-t&lt;/span&gt; laravel12 &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Dá pra ver que eu adicionei mais uns comandos ao &lt;strong&gt;Dockerfile&lt;/strong&gt; criando "aliases" para o &lt;code&gt;npm&lt;/code&gt; e o &lt;code&gt;npx&lt;/code&gt; (redirecinando para o &lt;code&gt;bun&lt;/code&gt; e o &lt;code&gt;bunx&lt;/code&gt;, respectivamente).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Este comando criará uma imagem chamada &lt;code&gt;laravel12&lt;/code&gt; baseada no &lt;strong&gt;Dockerfile&lt;/strong&gt; que acabamos de criar. Neste ponto, o arquivo não é mais necessário, então, fique à vontade para excluí-lo.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Neste passo, acabamos de criar uma imagem no nosso &lt;em&gt;daemon Docker local&lt;/em&gt;. Se você quiser compartilhar essa imagem com outros, pode enviá-la para um &lt;em&gt;Docker registry&lt;/em&gt;. Mas esse é um assunto para outro momento. De qualquer forma, enviei essa imagem para minha conta no &lt;a href="https://hub.docker.com/r/ranierivalenca/laravel12" rel="noopener noreferrer"&gt;Docker Hub&lt;/a&gt; e ela está disponível para você usar.&lt;/p&gt;


&lt;pre class="highlight shell"&gt;&lt;code&gt;docker pull ranierivalenca/laravel12
&lt;/code&gt;&lt;/pre&gt;

&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Testando
&lt;/h3&gt;

&lt;p&gt;Com a imagem criada e registrada no daemon Docker local, agora podemos criar um contêiner com ela.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; laravel12 bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se tudo correr bem, você deve estar dentro do contêiner. Agora podemos criar um projeto Laravel.&lt;/p&gt;

&lt;h2&gt;
  
  
  Criando um projeto Laravel
&lt;/h2&gt;

&lt;p&gt;Ok, vamos dar uma pausa para recapitular o que fizemos até aqui. Criamos um &lt;strong&gt;Dockerfile&lt;/strong&gt; que cria um contêiner com todas as dependências necessárias para rodar um projeto Laravel 12. Construímos a imagem e conseguimos criar um contêiner com ela. Agora, se criarmos um projeto Laravel dentro desse contêiner, todos os arquivos do projeto ficarão dentro do contêiner e serão perdidos quando o contêiner for interrompido. Para evitar isso, podemos criar um volume para armazenar os arquivos do projeto no sistema host.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;:/app laravel12 laravel new my-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dessa forma, estamos criando um volume que mapeia o diretório atual (&lt;code&gt;$(pwd)&lt;/code&gt;) para o diretório &lt;code&gt;/app&lt;/code&gt; dentro do contêiner. Assim, o diretório &lt;em&gt;my-app&lt;/em&gt; será criado dentro do diretório atual no sistema host. Agora podemos rodar o projeto.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;my-app
docker run &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;:/app &lt;span class="nt"&gt;-w&lt;/span&gt; /app laravel12 composer run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse comando cria um contêiner com o diretório &lt;code&gt;my-app&lt;/code&gt; (agora o diretório atual graças ao comando &lt;code&gt;cd&lt;/code&gt;) montado no diretório &lt;code&gt;/app&lt;/code&gt; dentro do contêiner. Ele também define o diretório de trabalho como &lt;code&gt;/app&lt;/code&gt; (para não precisarmos digitar &lt;code&gt;/app&lt;/code&gt; em cada comando ou rodar um comando &lt;code&gt;cd&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Tadah! Está rodando. Mas ainda não podemos acessar o projeto no navegador porque não expusemos nenhuma porta. E, além disso, por padrão (pelo menos neste momento), o comando &lt;code&gt;composer run dev&lt;/code&gt; inicia tanto o servidor PHP quanto o Vite (JS) vinculados ao &lt;code&gt;127.0.0.1&lt;/code&gt; (&lt;code&gt;localhost&lt;/code&gt;). Isso funciona quando estamos rodando o projeto diretamente no sistema host, mas não quando estamos rodando dentro de um contêiner. Mesmo se expusermos as portas, o aplicativo dentro do contêiner não responderá a solicitações vindas do systema host porque ele está vinculado ao &lt;code&gt;localhost&lt;/code&gt; do contêiner.&lt;/p&gt;

&lt;p&gt;Tudo isso pode parecer um pouco confuso, mas não se preocupe. Vamos resolver isso. Resumidamente, tudo que precisamos fazer é alterar o comando &lt;code&gt;artisan serve&lt;/code&gt; para escutar em &lt;code&gt;0.0.0.0&lt;/code&gt; e adicionar a opção &lt;code&gt;--host&lt;/code&gt; ao comando &lt;code&gt;npm run dev&lt;/code&gt;. A gente pode fazer isso apenas alterando o arquivo &lt;code&gt;composer.json&lt;/code&gt; do projeto.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'s/artisan serve/artisan serve --host 0.0.0.0/g'&lt;/span&gt; composer.json
&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'s/run dev/run dev --host/g'&lt;/span&gt; composer.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Se você estiver usando Windows, você pode instalar o &lt;a href="https://git-scm.com" rel="noopener noreferrer"&gt;Git Bash&lt;/a&gt; ou o &lt;a href="https://docs.microsoft.com/en-us/windows/wsl" rel="noopener noreferrer"&gt;WSL&lt;/a&gt; para rodar esses comandos. Se você estiver usando o MacOS, o comando &lt;code&gt;sed -i&lt;/code&gt; espera um argumento para criar um backup do arquivo original. Se você não quiser criar um backup, adicione um argumento vazio, como &lt;code&gt;sed -i ''&lt;/code&gt;. Claro que você também pode fazer essa edição manualmente usando um editor de texto.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Agora a gente pode rodar o projeto de novo, expondo as portas necessárias.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;:/app &lt;span class="nt"&gt;-w&lt;/span&gt; /app &lt;span class="nt"&gt;-p&lt;/span&gt; 8000:8000 &lt;span class="nt"&gt;-p&lt;/span&gt; 5173:5173 laravel12 composer run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora você pode acessar o projeto Laravel no navegador em &lt;code&gt;http://localhost:8000&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Expandindo o Dockerfile e dependências
&lt;/h2&gt;

&lt;p&gt;Como eu falei antes, este projeto específico requer uma conexão com o MongoDB. Então, temos que instalar a extensão &lt;code&gt;mongodb&lt;/code&gt; para o PHP. Também vamos precisar ter o servidor de MongoDB rodando. Vamos por partes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Adicionando a extensão PHP MongoDB
&lt;/h3&gt;

&lt;p&gt;Para nossa sorte, a &lt;a href="https://hub.docker.com/_/php" rel="noopener noreferrer"&gt;imagem do PHP&lt;/a&gt; que estamos usando vem com alguns scripts para ajudar a instalar extensões PHP. Vamos usar um desses scripts para instalar a extensão &lt;code&gt;mongodb&lt;/code&gt;. Como antes, vamos criar um contêiner para testar a instalação manualmente.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; laravel12 bash
&lt;span class="c"&gt;# Dentre do contêiner&lt;/span&gt;
docker-php-ext-install mongodb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Epa. Não funcionou. A extensão &lt;code&gt;mongodb&lt;/code&gt; não está disponível em &lt;code&gt;/usr/src/php/ext&lt;/code&gt;, diretório do contêiner que vêm com algumas extensões pré-instaladas. Vamos tentar instalar a extensão manualmente. Vamos tentar com o PECL.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pecl &lt;span class="nb"&gt;install &lt;/span&gt;mongodb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O processo de instalação vai perguntar algumas coisas. Apenas vá apertando Enter para acetar os valores padrão. Você pode ler mais sobre as opções no &lt;a href="https://pecl.php.net/package/mongodb" rel="noopener noreferrer"&gt;site do PECL&lt;/a&gt;, no &lt;a href="https://docs.mongodb.com/drivers/php" rel="noopener noreferrer"&gt;site do MongoDB&lt;/a&gt; ou no &lt;a href="https://www.php.net/manual/en/mongodb.installation.php" rel="noopener noreferrer"&gt;site do PHP&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Agora (depois de algum tempo - essa extensão é grande e o processo de instalação é lento), a extensão &lt;code&gt;mongodb&lt;/code&gt; está instalada, mas não está habilitada. Vamos habilitá-la.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker-php-ext-enable mongodb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E agora a extensão &lt;code&gt;mongodb&lt;/code&gt; está habilitada. Vamos testar.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php &lt;span class="nt"&gt;-m&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;mongodb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pronto. Podemos sair do contêiner e criar o Dockerfile para automatizar a instalação da extensão &lt;code&gt;mongodb&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; laravel12&lt;/span&gt;

&lt;span class="c"&gt;# Instalar a extensão mongodb&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;pecl &lt;span class="nb"&gt;install &lt;/span&gt;mongodb &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; docker-php-ext-enable mongodb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você pode notar que esse processo é bem simiar ao que usamos pra instalar a extensão &lt;code&gt;pcntl&lt;/code&gt; antes. A principal diferença é que a extensão &lt;code&gt;pcntl&lt;/code&gt; já está disponível no diretório &lt;code&gt;/usr/src/php/ext&lt;/code&gt; e pode ser instalada com o comando &lt;code&gt;docker-php-ext-install&lt;/code&gt;. Já a extensão &lt;code&gt;mongodb&lt;/code&gt; não está disponível lá e tem que ser instalada com o PECL.&lt;/p&gt;

&lt;p&gt;Usando esse novo &lt;strong&gt;Dockerfile&lt;/strong&gt;, podemos construir uma nova imagem.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker build &lt;span class="nt"&gt;-t&lt;/span&gt; laravel12:with-mongodb &lt;span class="nb"&gt;.&lt;/span&gt;
docker run &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; laravel12:with-mongodb php &lt;span class="nt"&gt;-m&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;mongodb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Usando esses conhecimentos, podemos expandir o &lt;strong&gt;Dockerfile&lt;/strong&gt; para instalar qualquer extensão PHP que precisarmos, seja usando o &lt;code&gt;docker-php-ext-install&lt;/code&gt; ou o PECL.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Se essa imagem for exatamente o que você precisa (ou seja, algo capaz de criar / executar um projeto em Laravel 12 com MongoDB), você pode encontrá-la no meu &lt;a href="https://hub.docker.com/repository/docker/ranierivalenca/laravel12/tags/with-mongodb/sha256-0e1c4ad3e167eeaa5a6a2d087ea6fb61d53964d9c50b30ee7a234c835eb6af86" rel="noopener noreferrer"&gt;Docker Hub&lt;/a&gt; e usá-la.&lt;/p&gt;


&lt;pre class="highlight shell"&gt;&lt;code&gt;docker pull ranierivalenca/laravel12:with-mongodb
&lt;/code&gt;&lt;/pre&gt;

&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Adicionando o servidor MongoDB
&lt;/h3&gt;

&lt;p&gt;Para rodar o servidor MongoDB, podemos usar a &lt;a href="https://hub.docker.com/_/mongo" rel="noopener noreferrer"&gt;imagem oficial do MongoDB&lt;/a&gt;. Vamos criar um contêiner com essa imagem.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; mongodb &lt;span class="nt"&gt;-p&lt;/span&gt; 27017:27017 &lt;span class="nt"&gt;--network-alias&lt;/span&gt; mongo mongo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com esse comando, estamos criando um contêiner chamado &lt;code&gt;mongodb&lt;/code&gt; com a imagem oficial do MongoDB. Estamos expondo a porta &lt;code&gt;27017&lt;/code&gt; para o host (caso queiramos acessar o servidor MongoDB diretamente) e estamos adicionando um alias de rede &lt;code&gt;mongo&lt;/code&gt; para o contêiner (para que possamos nos referir a ele pelo nome &lt;code&gt;mongo&lt;/code&gt; em vez de pelo IP) &lt;strong&gt;dentro da rede padrão do Docker&lt;/strong&gt;. Agora, podemos acessar o servidor MongoDB pelo nome &lt;code&gt;mongo&lt;/code&gt; - lembre que o projeto Laravel vai rodar dentro de um contêiner e, por padrão, os contêineres podem se comunicar entre si pelo nome ou pelo IP (ambos atribuídos pelo Docker).&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Eu espero que você tenha aproveitado essa jornada tanto quanto eu. Eu aprendi muito enquanto escrevia este artigo e espero que você também tenha aprendido algo. Se você tiver alguma dúvida, sugestão ou correção, fique à vontade para comentar.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Creating and running a Laravel 12 Project with (kinda) Zero Dependency using Docker</title>
      <dc:creator>Ranieri Valença</dc:creator>
      <pubDate>Fri, 28 Feb 2025 16:29:22 +0000</pubDate>
      <link>https://dev.to/ranierivalenca/creating-and-running-a-laravel-12-project-with-kinda-zero-dependency-using-docker-3fe4</link>
      <guid>https://dev.to/ranierivalenca/creating-and-running-a-laravel-12-project-with-kinda-zero-dependency-using-docker-3fe4</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;The goal is to create and run a Laravel 12 project without installing any dependencies on the host system. To achieve this, I created a Dockerfile containing PHP, Composer and Bun. You can jump to the Dockerfile section to see the final result if you are in a hurry.&lt;/p&gt;

&lt;p&gt;A side quest is to install the MongoDB PHP extension. You can jump to the Extending the Dockerfile and dependencies section to see how I did it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;As a Web Development teacher, I have to deal with many different environments, languages and frameworks. Often I have to install a lot of binaries, libraries and dependencies system-wide to be able to run a simple "Hello World" program. This is not only time-consuming but also can lead to conflicts between different versions of the same library or binary.&lt;/p&gt;

&lt;p&gt;Since I’m quite disorganized, I tend to forget to uninstall these dependencies and binaries after finishing my work. This leads to a lot of garbage in my system, which can slow down my computer and make it harder to find the right version of a library when I need it. Also, again, lots of conflicts.&lt;/p&gt;

&lt;p&gt;Yesterday I faced a new challenge on a student's project: they wanted to create a Laravel 12 project on the college lab environment, but they didn't have the permissions to install anything on the system. Moreover, the PHP version installed on the lab was outdated (for Laravel 12 purposes) and they couldn't update it. And they wanted to connect Laravel with a MongoDB database - which wasn't installed.&lt;/p&gt;

&lt;p&gt;So, I proposed a challenge: create a Laravel 12 project with zero installed dependencies. And now I'm sharing this challenge with you - with my solution.&lt;/p&gt;

&lt;p&gt;In this article, I'll present you my workflow for achieving this goal. I'll share my thoughts and decisions, the problems I faced and how I solved them. &lt;br&gt;
In addition to being a &lt;strong&gt;very&lt;/strong&gt; passionate developer, I'm also a teacher, so I'll try to explain everything I did in a way that everyone can understand. I hope you enjoy it.&lt;/p&gt;
&lt;h2&gt;
  
  
  The process
&lt;/h2&gt;

&lt;p&gt;After some consideration, the solution I found was to use Docker to create a container with all the dependencies needed to run a Laravel 12 project. This way, we can create a Laravel project inside the container and run it without installing anything on the host system. Or just use the container as a development environment and (kinda) run the project on the host system. This way, we can also avoid conflicts between different versions of the same library or binary.&lt;/p&gt;

&lt;p&gt;Of course we could achieve the same result using a virtual machine, but Docker is faster and more lightweight. We could (probably) also use virtual environments, but they would be less straightforward and more complex. And they either wouldn’t work in the college lab environment or students would leave the virtual environment running indefinitely, leading to other (less experienced) students using and messing with it.&lt;/p&gt;

&lt;p&gt;Back to the Docker approach, this can be a bit challenging at first, because &lt;a href="https://laravel.com/docs/12.x/installation#creating-a-laravel-project" rel="noopener noreferrer"&gt;Laravel 12's requirements&lt;/a&gt; are: PHP, Composer, the &lt;strong&gt;Laravel Installer&lt;/strong&gt; (the kind of binary I usually avoid to install system-wide) and Node + NPM (or &lt;a href="https://bun.sh" rel="noopener noreferrer"&gt;Bun&lt;/a&gt; (?)). There are some more requirements they don't mention, but we'll talk about them later.&lt;/p&gt;

&lt;p&gt;Usually when I need to run something on a Docker container, I look at the &lt;a href="https://hub.docker.com" rel="noopener noreferrer"&gt;official Docker Hub&lt;/a&gt; to find an image that already has the dependencies I need. I also have a personal preference for using official images, because I (1) trust them more and (2) they are usually more up-to-date.&lt;/p&gt;

&lt;p&gt;For this challenge, considering my personal preferences, I found the following images:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://hub.docker.com/_/php" rel="noopener noreferrer"&gt;PHP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hub.docker.com/_/composer" rel="noopener noreferrer"&gt;Composer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hub.docker.com/_/node" rel="noopener noreferrer"&gt;Node&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each of these has an official image on Docker Hub, but they are not meant to be used together. So, I had to create a custom Dockerfile to create a container with all the dependencies I needed. And now I have to decide which one will be the base image that will make work easier.&lt;/p&gt;

&lt;p&gt;As for now, the &lt;code&gt;latest&lt;/code&gt; image for Composer &lt;a href="https://hub.docker.com/layers/library/composer/latest/images/sha256-6d0765ae33c7a3aa26688a1d61dcd46880896a4ed07a874073b7dcadae4930ac" rel="noopener noreferrer"&gt;is based&lt;/a&gt; on&lt;a href="https://www.alpinelinux.org" rel="noopener noreferrer"&gt;Alpine Linux&lt;/a&gt;, that is very minimal and lightweight, but would require me to install PHP and Node manually. Node and PHP are both based on Debian (what makes me feel more comfortable). So, I decided to use the PHP image as the base image for my custom Dockerfile.&lt;/p&gt;
&lt;h2&gt;
  
  
  The proof of concept
&lt;/h2&gt;

&lt;p&gt;I envy those who can jump straight into writing a Dockerfile without real-world testing — people who truly know what they’re doing and which commands and packages they need. I’m not one of them. So, before heading to the Dockerfile, I decided to create a container with the PHP image and try to install Composer and Bun on it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; php bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;This command will create a container with the PHP image and run the &lt;code&gt;bash&lt;/code&gt; command inside it. The &lt;code&gt;--rm&lt;/code&gt; flag will remove the container when it stops. This way, I can test things without leaving garbage on my system.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Composer
&lt;/h3&gt;

&lt;p&gt;Okay, now I'm inside the container. Let's try to &lt;a href="https://getcomposer.org/download/" rel="noopener noreferrer"&gt;install Composer&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s2"&gt;"copy('https://getcomposer.org/installer', 'composer-setup.php');"&lt;/span&gt;
php composer-setup.php
php &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s2"&gt;"unlink('composer-setup.php');"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It worked! Just one more command to move the &lt;code&gt;composer.phar&lt;/code&gt; file to the &lt;code&gt;/usr/local/bin&lt;/code&gt; directory and make it &lt;em&gt;system-wide&lt;/em&gt; available (not on my system, but on the container).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mv &lt;/span&gt;composer.phar /usr/local/bin/composer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Bun
&lt;/h3&gt;

&lt;p&gt;Nice. Now, for a bit of a challenge, let's try to install &lt;a href="https://bun.sh" rel="noopener noreferrer"&gt;Bun&lt;/a&gt; - a Node.js version manager. I'm not sure if it will work, but let's try.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://bun.sh/install | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Oh crap! Bun needs &lt;code&gt;unzip&lt;/code&gt; that isn't installed on the container. Let's install it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apt-get update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; unzip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Back to the Bun installation.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://bun.sh/install | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It worked! One more command Bun asked me to run and it's installed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;source&lt;/span&gt; /root/.bashrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;In fact it was already "installed", but in order to get it working on my current shell session, I had to run this to reload the &lt;code&gt;.bashrc&lt;/code&gt; file.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now, let’s test if everything is working so far.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer &lt;span class="nt"&gt;--version&lt;/span&gt;
bun &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Beautiful! Let's create a Laravel project now as it is recommended by the &lt;a href="https://laravel.com/docs/12.x/installation#installing-php" rel="noopener noreferrer"&gt;official documentation&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer global require laravel/installer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;This command will install the Laravel Installer globally, so we can run it from anywhere.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Okay, next.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;laravel new example-app
&lt;span class="c"&gt;# bash: laravel: command not found&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Wait, &lt;a href="https://www.destroyallsoftware.com/talks/wat" rel="noopener noreferrer"&gt;wat&lt;/a&gt;? This wasn't part of the plan. Why is this happening? Let's try to find out.&lt;/p&gt;

&lt;p&gt;According to &lt;a href="https://getcomposer.org/doc/03-cli.md#global" rel="noopener noreferrer"&gt;Composer documentation&lt;/a&gt;, the &lt;code&gt;composer global&lt;/code&gt; command I have just run installs packages in the &lt;code&gt;COMPOSER_HOME&lt;/code&gt; directory. Let's check it out.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$COMPOSER_HOME&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Oh, great - there is no &lt;code&gt;COMPOSER_HOME&lt;/code&gt; environment variable. Let's go back to the &lt;a href="https://getcomposer.org/doc/03-cli.md#composer-home" rel="noopener noreferrer"&gt;Composer documentation&lt;/a&gt; and see what it says. Oh, okay, by default it is &lt;code&gt;~/.composer&lt;/code&gt;. Let's check it out.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; ~/.composer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Well, there is a &lt;code&gt;vendor&lt;/code&gt; directory there, and checking it out (&lt;code&gt;ls -la ~/.composer/vendor&lt;/code&gt;) I can see a &lt;code&gt;Laravel&lt;/code&gt; directory and a &lt;code&gt;bin&lt;/code&gt; directory inside it. Let me check the &lt;code&gt;bin&lt;/code&gt; directory.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; ~/.composer/vendor/bin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hmm, there is a &lt;code&gt;laravel&lt;/code&gt; executable file there. Let's try to run it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;~/.composer/vendor/bin/laravel  &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It worked! Now I have to add the &lt;code&gt;~/.composer/vendor/bin&lt;/code&gt; directory to the &lt;code&gt;PATH&lt;/code&gt; environment variable.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;:/root/.composer/vendor/bin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Another way to access the &lt;code&gt;laravel&lt;/code&gt; executable is through the &lt;a href="https://getcomposer.org/doc/03-cli.md#exec" rel="noopener noreferrer"&gt;Composer exec&lt;/a&gt; command.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer global &lt;span class="nb"&gt;exec &lt;/span&gt;laravel &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now I can (hopefully) create a Laravel project.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;laravel new my-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Laravel now asks me some more questions than before (more than a year since my last Laravel project), but it (kinda) worked. By the end of the process, it asked if I wanted to run &lt;code&gt;npm install&lt;/code&gt; and &lt;code&gt;npm run dev&lt;/code&gt;. I said yes, but it failed because I opted for Bun instead and it has no &lt;code&gt;npm&lt;/code&gt; installed.&lt;/p&gt;

&lt;p&gt;The Bun project looks promising (this is my first time using it), but Laravel still seems to be optimized for Node.js and NPM. Let me try installing dependencies using Bun instead.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;my-app
bun i &lt;span class="c"&gt;# or bun install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Well, it worked. I’m unsure if this approach will work for all Laravel projects. Still, I’m happy with the results so far.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aaaanndd... no. It looks like Laravel 12 is transitioning from "old school laravel's" &lt;code&gt;php artisan ...&lt;/code&gt; to Composer's scripts and while it suggests Bun as an option to Node.js+NPM, it still uses NPM scripts. The last command failed because it tried to run &lt;code&gt;npx ...&lt;/code&gt; and I got a &lt;code&gt;sh: 1: npx: not found&lt;/code&gt; error. So sad.&lt;/p&gt;

&lt;p&gt;Now I have some options here: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;install Node.js and &lt;code&gt;npx&lt;/code&gt; on this container;&lt;/li&gt;
&lt;li&gt;change the Laravel project to use Bun instead of NPM;&lt;/li&gt;
&lt;li&gt;find what is the bun replacement for &lt;code&gt;npx&lt;/code&gt; and use it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'll dig a bit more on the last option. The &lt;a href="https://bun.sh/docs/cli/bunx" rel="noopener noreferrer"&gt;Bun CLI documentation presents &lt;code&gt;bunx&lt;/code&gt; or &lt;code&gt;bun x&lt;/code&gt; as a replacement for &lt;code&gt;npx&lt;/code&gt;&lt;/a&gt;.Checking the &lt;code&gt;bunx&lt;/code&gt; origin inside the container (&lt;code&gt;which bunx&lt;/code&gt;) and listing it (&lt;code&gt;ls -la $(which bunx)&lt;/code&gt;), I see that it's a symlink to the &lt;code&gt;bun&lt;/code&gt; executable. So, let's try to create another symlink to it called - you guessed it - &lt;code&gt;npx&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;which bunx&lt;span class="si"&gt;)&lt;/span&gt; /usr/local/bin/npx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now let's try running the &lt;code&gt;composer run dev&lt;/code&gt; command again.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And it worked! Well, at least the &lt;code&gt;npx&lt;/code&gt; command did. Now I have a PHP RuntimeException asking me for the &lt;code&gt;pcntl&lt;/code&gt; extension. Luckily I choose the PHP image as the base image - directly from its overview (&lt;a href="https://hub.docker.com/_/php" rel="noopener noreferrer"&gt;https://hub.docker.com/_/php&lt;/a&gt;) we have "How to install more PHP extensions" (how I wish all images had this kind of documentation). Let's try to install the missing extension.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker-php-ext-install pcntl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And now I can try again.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And it worked! I have a Laravel 12 project running on a container with zero installed dependencies. I'm happy with the results so far. I'm also happy with all steps I took to get here. Now, let's move on to the next step and create a Dockerfile to automate all these steps.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Dockerfile
&lt;/h3&gt;

&lt;p&gt;Now I feel confident enough to create a Dockerfile to automate all these steps. Let's create a file named &lt;code&gt;Dockerfile&lt;/code&gt; (&lt;code&gt;touch Dockerfile&lt;/code&gt; if you are on a Unix-like system (Linux or MacOS), or &lt;code&gt;type nul &amp;gt; Dockerfile&lt;/code&gt; if you are on Windows) and paste the following content.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; php:latest&lt;/span&gt;

&lt;span class="c"&gt;# Install unzip&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; unzip

&lt;span class="c"&gt;# Install Composer using another strategy but with the same result&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;curl &lt;span class="nt"&gt;-sS&lt;/span&gt; https://getcomposer.org/installer | php &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--install-dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/local/bin &lt;span class="nt"&gt;--filename&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;composer

&lt;span class="c"&gt;# Set the environment variables&lt;/span&gt;
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; HOME="/root"&lt;/span&gt;
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; PATH="/root/.composer/vendor/bin:${PATH}:/root/.bun/bin"&lt;/span&gt;

&lt;span class="c"&gt;# Install Bun&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://bun.sh/install | bash

&lt;span class="c"&gt;# Create some symlinks to the bun executable&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nb"&gt;ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;which bun&lt;span class="si"&gt;)&lt;/span&gt; /usr/local/bin/npm
&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nb"&gt;ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;which bunx&lt;span class="si"&gt;)&lt;/span&gt; /usr/local/bin/npx

&lt;span class="c"&gt;# Install Laravel Installer&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;composer global require laravel/installer

&lt;span class="c"&gt;# Install pcntl extension&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;docker-php-ext-install pcntl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now let's build the image.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker build &lt;span class="nt"&gt;-t&lt;/span&gt; laravel12 &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command will create an image named &lt;code&gt;laravel12&lt;/code&gt; based on the &lt;code&gt;Dockerfile&lt;/code&gt; we just created. At this point, the file is no longer needed, so feel free to delete it.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In this step we just created an image on our local Docker daemon. If you want to share this image with others, you can push it to a Docker registry. But this is a topic for another time. Anyway, I have pushed this image to my &lt;a href="https://hub.docker.com/r/ranierivalenca/laravel12" rel="noopener noreferrer"&gt;Docker Hub&lt;/a&gt; account and it is available for you to use.&lt;/p&gt;


&lt;pre class="highlight shell"&gt;&lt;code&gt;docker pull ranierivalenca/laravel12
&lt;/code&gt;&lt;/pre&gt;

&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Testing
&lt;/h3&gt;

&lt;p&gt;With the image created and registered on the local Docker daemon, we can now create a container with it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; laravel12 bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If everything went well, you should be inside the container. Now we can create a Laravel project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating a Laravel project
&lt;/h2&gt;

&lt;p&gt;Okay, let's take a moment to recap what we have done so far. We have created a Dockerfile that creates a container with all the dependencies needed to run a Laravel 12 project. We have built the image and were able to create a container with it. If now we create a Laravel project inside this container, all the project's files will be inside the container and will be lost when the container stops. To avoid this, we can create a volume to store the project's files on the host system.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;:/app laravel12 laravel new my-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This way, we are creating a volume that maps the current directory (&lt;code&gt;$(pwd)&lt;/code&gt;) to the &lt;code&gt;/app&lt;/code&gt; directory inside the container. So, the &lt;em&gt;my-app&lt;/em&gt; directory will be created inside the current directory on the host system. Now we can run the project.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;my-app
docker run &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;:/app &lt;span class="nt"&gt;-w&lt;/span&gt; /app laravel12 composer run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command will create a container with the &lt;code&gt;my-app&lt;/code&gt; (now the current directory thanks to &lt;code&gt;cd&lt;/code&gt; command) directory mounted on the &lt;code&gt;/app&lt;/code&gt; directory inside the container. It will also set the working directory to &lt;code&gt;/app&lt;/code&gt; (so we don't have to type &lt;code&gt;/app&lt;/code&gt; on every command or do a &lt;code&gt;cd&lt;/code&gt; command).&lt;/p&gt;

&lt;p&gt;Tadah! It's running. Unfortunately, we can't access the project on the browser because we didn't expose any ports. And, moreover, by default (at this present time at least), the &lt;code&gt;composer run dev&lt;/code&gt; command start both PHP and Vite (JS) servers bound to &lt;code&gt;127.0.0.1&lt;/code&gt; (&lt;code&gt;localhost&lt;/code&gt;). This is fine when we are running the project directly on the host system, but not when we are running it inside a container. Even if we expose the ports, the app inside the container won’t respond to requests from the host system because it’s bound to &lt;code&gt;127.0.0.1&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;All this can look a bit confusing, but it's not that hard. In summary, all we have to do is to change the &lt;code&gt;artisan serve&lt;/code&gt; command to bind to &lt;code&gt;0.0.0.0&lt;/code&gt; and add a &lt;code&gt;--host&lt;/code&gt; option to the &lt;code&gt;npm run dev&lt;/code&gt; command. We can do this by editing the &lt;code&gt;composer.json&lt;/code&gt; file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'s/artisan serve/artisan serve --host 0.0.0.0/g'&lt;/span&gt; composer.json
&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'s/run dev/run dev --host/g'&lt;/span&gt; composer.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;If you are using Windows, you can use the &lt;code&gt;sed&lt;/code&gt; command on Git Bash or WSL. If you are using PowerShell, you can use the &lt;code&gt;Get-Content&lt;/code&gt; and &lt;code&gt;Set-Content&lt;/code&gt; cmdlets. If you are using MacOS, the &lt;code&gt;sed -i&lt;/code&gt; command expects an argument after the &lt;code&gt;-i&lt;/code&gt; option, so you can use &lt;code&gt;sed -i ''&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now we can run the project again., exposing the ports.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;:/app &lt;span class="nt"&gt;-w&lt;/span&gt; /app &lt;span class="nt"&gt;-p&lt;/span&gt; 8000:8000 &lt;span class="nt"&gt;-p&lt;/span&gt; 5173:5173 laravel12 composer run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we can access the project on your browser at &lt;code&gt;http://localhost:8000&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Extending the Dockerfile and dependencies
&lt;/h2&gt;

&lt;p&gt;As I mentioned before, this specific Laravel 12 project requires a MongoDB database. So, we have to install the MongoDB PHP extension. We also need to have a MongoDB server running. Let's break this down into steps.&lt;/p&gt;

&lt;h3&gt;
  
  
  Adding the MongoDB PHP extension
&lt;/h3&gt;

&lt;p&gt;Luckily, the &lt;a href="https://hub.docker.com/_/php" rel="noopener noreferrer"&gt;PHP image&lt;/a&gt; has some scripts that may help us to install PHP extensions. Let's try using the most basic one, the &lt;code&gt;docker-php-ext-install&lt;/code&gt; script. Like before, I'll make some real-world testing before adding it to the Dockerfile.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; laravel12 bash
&lt;span class="c"&gt;# Inside the container&lt;/span&gt;
docker-php-ext-install mongodb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Oops. It didn't work. The &lt;em&gt;mongodb&lt;/em&gt; extension isn't available on the &lt;code&gt;/usr/src/php/ext&lt;/code&gt; directory that came with our PHP image. We'll have to install it manually. Let's try to install it using PECL.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pecl &lt;span class="nb"&gt;install &lt;/span&gt;mongodb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The installation process will ask you some questions. Just press Enter to accept the default values. You can check this options on the &lt;a href="https://pecl.php.net/package/mongodb" rel="noopener noreferrer"&gt;PECL site&lt;/a&gt;, on the &lt;a href="https://docs.mongodb.com/drivers/php" rel="noopener noreferrer"&gt;MongoDB site&lt;/a&gt; or on the &lt;a href="https://www.php.net/manual/en/mongodb.installation.php" rel="noopener noreferrer"&gt;PHP site&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Now (after a while - this is a kinda big extension), the extension is built and installed, but we need to enable it. Let's do this using another (very pleasant) PHP script.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker-php-ext-enable mongodb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To ensure everything is working, let's check if the extension is installed and enabled.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php &lt;span class="nt"&gt;-m&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;mongodb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And we're done! Now we can exit the container and add these commands to a new &lt;code&gt;Dockerfile&lt;/code&gt; that will use the &lt;code&gt;laravel12&lt;/code&gt; image as the base image.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; laravel12&lt;/span&gt;

&lt;span class="c"&gt;# Install the MongoDB PHP extension&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;pecl &lt;span class="nb"&gt;install &lt;/span&gt;mongodb &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; docker-php-ext-enable mongodb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You'll find that this process is very similar to the one we used to install the &lt;code&gt;pcntl&lt;/code&gt; extension. The main difference is that we are using the &lt;code&gt;pecl&lt;/code&gt; command instead of the &lt;code&gt;docker-php-ext-install&lt;/code&gt; command.&lt;/p&gt;

&lt;p&gt;Using this new &lt;code&gt;Dockerfile&lt;/code&gt;, we can build a new image and create a container with it. We can also test if the MongoDB PHP extension is installed and enabled.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker build &lt;span class="nt"&gt;-t&lt;/span&gt; laravel12:with-mongodb &lt;span class="nb"&gt;.&lt;/span&gt;
docker run &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; laravel12:with-mongodb php &lt;span class="nt"&gt;-m&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;mongodb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Using this approach, we can now install any PHP extension we need. We just have to find the right package name and use either the &lt;code&gt;docker-php-ext-install&lt;/code&gt; or &lt;code&gt;pecl install&lt;/code&gt; plus &lt;code&gt;docker-php-ext-enable&lt;/code&gt; commands depending on the extension.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If this matches your needs, you can get this image from my &lt;a href="https://hub.docker.com/repository/docker/ranierivalenca/laravel12/tags/with-mongodb/sha256-0e1c4ad3e167eeaa5a6a2d087ea6fb61d53964d9c50b30ee7a234c835eb6af86" rel="noopener noreferrer"&gt;Docker Hub&lt;/a&gt; account.&lt;/p&gt;


&lt;pre class="highlight shell"&gt;&lt;code&gt;docker pull ranierivalenca/laravel12:with-mongodb
&lt;/code&gt;&lt;/pre&gt;

&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Adding the MongoDB server
&lt;/h3&gt;

&lt;p&gt;To run a MongoDB server, we can use the &lt;a href="https://hub.docker.com/_/mongo" rel="noopener noreferrer"&gt;official MongoDB&lt;/a&gt; image. We can create a container with this image and run it in the background. We can also expose the default MongoDB port (27017) to the host system.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; mongodb &lt;span class="nt"&gt;-p&lt;/span&gt; 27017:27017 &lt;span class="nt"&gt;--network-alias&lt;/span&gt; mongo mongo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command creates a container named &lt;code&gt;mongodb&lt;/code&gt; with the &lt;code&gt;mongo&lt;/code&gt; image, exposing the default MongoDB port (27017) to the host system (in case you want to access it externally) and assigning it the alias &lt;code&gt;mongo&lt;/code&gt; in Docker’s internal network. Now we can connect to this server from our Laravel project through the &lt;code&gt;mongo&lt;/code&gt; hostname - just remember your project will be running inside a container connected to the same (docker) network as the MongoDB server.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;I hope you enjoyed this journey as much as I did! I learned a lot, and I hope you did too. I’m pleased with the results and the journey that led me here — I hope you are too! If you have any questions, suggestions or corrections, please let me know. I’m always open to learning new things and improving my knowledge.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Banco de dados no Desenvolvimento Web</title>
      <dc:creator>Ranieri Valença</dc:creator>
      <pubDate>Tue, 17 Oct 2023 15:56:44 +0000</pubDate>
      <link>https://dev.to/ranierivalenca/banco-de-dados-no-desenvolvimento-web-k78</link>
      <guid>https://dev.to/ranierivalenca/banco-de-dados-no-desenvolvimento-web-k78</guid>
      <description>&lt;h2&gt;
  
  
  Introdução - Bancos de Dados como a Base do Desenvolvimento Web
&lt;/h2&gt;

&lt;p&gt;O universo da tecnologia e do desenvolvimento web tem, como sua base fundamental, os dados. Em essência, as aplicações web são construídas para proporcionar a disponibilidade, organização e manipulação eficaz dessas informações. É por esse motivo que o entendimento sobre bancos de dados se torna crucial nesse contexto.&lt;/p&gt;

&lt;h3&gt;
  
  
  Banco de Dados vs. Sistema de Gerenciamento de Banco de Dados (SGBD)
&lt;/h3&gt;

&lt;p&gt;Antes de mergulharmos nos detalhes dos bancos de dados e dos SGBDs, é importante esclarecer as diferenças entre esses termos, frequentemente usados de forma intercambiável. Em essência, um banco de dados é uma estrutura que serve para armazenar informações, enquanto um Sistema de Gerenciamento de Banco de Dados (SGBD) é uma aplicação ou software específico projetado para gerenciar e facilitar o acesso a esses dados.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Banco de Dados&lt;/strong&gt;: Esta é a entidade que atua como o repositório central para armazenar informações. Ele é o local onde os dados são organizados, estruturados e, em última análise, armazenados.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SGBD&lt;/strong&gt;: Por outro lado, o SGBD é a ferramenta que permite aos usuários interagirem com o banco de dados. Ele oferece uma variedade de funcionalidades, como inserção, atualização, exclusão e recuperação de dados. O SGBD também é responsável por garantir a segurança, a integridade e a consistência dos dados.&lt;/p&gt;

&lt;p&gt;Neste contexto, MySQL, PostgreSQL, Oracle, SQL Server, Firestore (Firebase), MongoDB e outros são SGBDs, softwares que facilitam e gerenciam o acesso aos dados contidos em seus repositórios (bancos de dados), sendo os dois últimos exemplos de SGBDs NoSQL (Not Only SQL).&lt;/p&gt;

&lt;h2&gt;
  
  
  Bancos de Dados Relacionais e Não Relacionais
&lt;/h2&gt;

&lt;p&gt;Na introdução acima, citamos os termos SQL e NoSQL. SQL é uma linguagem de consulta (&lt;em&gt;Structured Query Language&lt;/em&gt;) desenvolvida para manipular e acessar dados contidos em bancos de dados relacionais. Um banco de dados relacional refere-se a uma forma de organização de dados que utiliza tabelas para armazenar informações. Essas tabelas são interconectadas por meio de chaves e relacionamentos definidos, seguindo um modelo predefinido.&lt;/p&gt;

&lt;p&gt;No entanto, existem outros tipos de bancos de dados que não se encaixam nesse modelo relacional. Eles são conhecidos como bancos de dados NoSQL (Not Only SQL), e são projetados para lidar com tipos de dados mais variados e flexíveis, como documentos, gráficos, pares chave-valor, entre outros. Aqui estão algumas informações adicionais sobre essas categorias:&lt;/p&gt;

&lt;h3&gt;
  
  
  Bancos de Dados Relacionais
&lt;/h3&gt;

&lt;p&gt;Os bancos de dados relacionais são baseados em um modelo de dados tabular, onde as informações são organizadas em tabelas com linhas e colunas. As relações entre essas tabelas são estabelecidas por meio de chaves primárias e estrangeiras. Alguns exemplos populares de SGBDs relacionais incluem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;MySQL&lt;/strong&gt;: Um SGBD de código aberto amplamente usado que é conhecido por sua velocidade e confiabilidade.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;PostgreSQL&lt;/strong&gt;: Um SGBD de código aberto conhecido por seu alto desempenho e suporte a recursos avançados.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Oracle&lt;/strong&gt;: Um SGBD comercial amplamente utilizado em empresas, conhecido por sua escalabilidade e recursos de segurança.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;SQL Server&lt;/strong&gt;: Um SGBD da Microsoft com recursos avançados, como integração com o ambiente Windows.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Bancos de Dados NoSQL
&lt;/h3&gt;

&lt;p&gt;Os bancos de dados NoSQL se destacam por sua flexibilidade e capacidade de lidar com tipos de dados variados. Eles não dependem do modelo tabular rígido dos bancos de dados relacionais. Em vez disso, eles utilizam modelos de dados mais diversos, como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Documentos&lt;/strong&gt;: Nesse modelo, os dados são armazenados em documentos semelhantes a JSON ou BSON. O &lt;strong&gt;MongoDB&lt;/strong&gt; é um exemplo popular desse tipo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Grafos&lt;/strong&gt;: Projetados para armazenar dados em forma de nós e arestas, excelentes para representar relações complexas. O &lt;strong&gt;Neo4j&lt;/strong&gt; é um SGBD de gráfico bem conhecido.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Chave-Valor&lt;/strong&gt;: Eles armazenam dados como pares chave-valor simples, sendo ideais para cenários de armazenamento em cache e recuperação rápida de informações. O &lt;strong&gt;Redis&lt;/strong&gt; é um exemplo notável.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Colunas amplas&lt;/strong&gt;: Esses bancos de dados armazenam dados em colunas, permitindo consultas eficientes em grandes conjuntos de dados. O &lt;strong&gt;Cassandra&lt;/strong&gt; é um exemplo.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Modelagem de Dados e Modelo Entidade-Relacionamento
&lt;/h2&gt;

&lt;p&gt;A modelagem de dados é um processo essencial no projeto de bancos de dados. Ela envolve a definição de como os dados serão estruturados, organizados e relacionados. Um dos métodos mais comuns de modelagem de dados é o Modelo Entidade-Relacionamento (ER), que utiliza diagramas para representar entidades, atributos e relacionamentos entre eles.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Entidades&lt;/strong&gt;: São objetos ou conceitos que armazenam informações e que visam modelar "coisas" do mundo real. Por exemplo, em um sistema de gerenciamento escolar, "Aluno" e "Professor" seriam entidades.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Atributos&lt;/strong&gt;: São as características ou propriedades das entidades. No caso de um aluno, os atributos podem incluir "Nome", "Idade" e "Endereço".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Relacionamentos&lt;/strong&gt;: Definem como as entidades estão conectadas umas às outras. Por exemplo, um relacionamento "Ensina" pode conectar a entidade "Professor" à entidade "Matéria".&lt;/p&gt;

&lt;p&gt;A modelagem de dados é crucial para garantir que o banco de dados atenda aos requisitos do sistema e que as consultas possam ser executadas de maneira eficiente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mais alguns conceitos sobre Bancos de Dados
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Modelo Físico
&lt;/h3&gt;

&lt;p&gt;Além do modelo lógico, que descreve a estrutura de dados em um nível abstrato, existe o modelo físico, que se concentra na implementação real do banco de dados em hardware específico. Isso inclui considerações sobre como os dados serão armazenados em disco, quais índices serão usados para otimizar as consultas e como os backups e a recuperação serão gerenciados.&lt;/p&gt;

&lt;h3&gt;
  
  
  Transações
&lt;/h3&gt;

&lt;p&gt;As transações são operações de banco de dados que envolvem uma ou mais ações. Elas garantem que um conjunto de operações seja executado de forma atômica, ou seja, todas as operações são bem-sucedidas ou nenhuma delas é executada. Isso garante a integridade dos dados, especialmente em ambientes de bancos de dados multiusuário.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conexão com o SGBD
&lt;/h2&gt;

&lt;p&gt;Como falamos, o SGBD é um software que visa facilitar o acesso aos dados. Ao invés de tratarmos com arquivos CSV como fizemos em exemplos anteriores nesta série, podemos manter os dados de nossa aplicação dentro de um banco de dados, sendo este banco gerenciado por um SGBD.&lt;/p&gt;

&lt;p&gt;Num nível mais baixo de abstração, um SGBD (relacional ou não) funciona como um software servidor, que espera por uma conexão de um cliente. No caso de SGBDs relacionais, o cliente que fará a conexão será a interface a partir da qual o desenvolvedor irá enviar os comandos em SQL e, eventualmente, ler os dados retornados pelo servidor do SGBD.&lt;/p&gt;

&lt;p&gt;Este software cliente pode ser uma interface visual, como o MySQL Workbench, uma interface de linha de comando (CLI - &lt;em&gt;command line interface&lt;/em&gt;) como o &lt;code&gt;psql&lt;/code&gt; ou o &lt;code&gt;mysql&lt;/code&gt; (executáveis a partir de um terminal de comando) ou um outro software qualquer, escrito em alguma linguagem de programação e que interage com um driver de acesso.&lt;/p&gt;

&lt;h3&gt;
  
  
  Driver
&lt;/h3&gt;

&lt;p&gt;Um driver, no contexto de conexão com um Sistema de Gerenciamento de Banco de Dados (SGBD), é um componente de software responsável por permitir que uma aplicação se comunique e interaja com o banco de dados. Ele age como uma ponte entre a aplicação, que está escrita em uma linguagem de programação específica, e o SGBD, que pode ter seu próprio conjunto de protocolos de comunicação.&lt;/p&gt;

&lt;h4&gt;
  
  
  Funcionalidade dos Drivers
&lt;/h4&gt;

&lt;p&gt;Os drivers desempenham várias funções essenciais:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Conexão com o Banco de Dados&lt;/strong&gt;: O driver estabelece a conexão inicial entre a aplicação e o banco de dados. Ele lida com os detalhes de comunicação, como endereço do servidor, autenticação e configurações de segurança.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tradução de Comandos&lt;/strong&gt;: Quando a aplicação envia comandos SQL para o SGBD, o driver traduz esses comandos para um formato que o banco de dados possa entender e processar. Isso é fundamental, pois diferentes SGBDs podem ter dialetos SQL ligeiramente diferentes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Gerenciamento de Conexão&lt;/strong&gt;: Os drivers gerenciam a alocação e o encerramento de conexões com o banco de dados. Isso inclui a criação de novas conexões quando necessário e a reutilização de conexões existentes para melhorar o desempenho.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Prevenção de Injeção SQL&lt;/strong&gt;: Muitos drivers têm medidas de segurança embutidas para evitar ataques de injeção SQL. Eles garantem que os comandos SQL inseridos pela aplicação sejam seguros e não representem uma ameaça à integridade dos dados.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Manipulação de Resultados&lt;/strong&gt;: Quando o SGBD retorna resultados de consultas, o driver os processa e os transforma em um formato compreensível para a aplicação. Isso pode incluir a conversão de tipos de dados e a estruturação dos resultados em objetos ou arrays utilizáveis.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Onde os Drivers São "Instalados"
&lt;/h4&gt;

&lt;p&gt;Os drivers geralmente fazem parte da pilha de tecnologia da aplicação e são incluídos no código ou referenciados como bibliotecas externas, dependendo da linguagem de programação utilizada. Eles são específicos para cada SGBD, o que significa que você precisa do driver correto para se conectar a um determinado banco de dados.&lt;/p&gt;

&lt;p&gt;Por exemplo, em PHP, você pode utilizar extensões como &lt;code&gt;mysqli&lt;/code&gt; ou &lt;code&gt;PDO&lt;/code&gt; (PHP Data Objects) para se conectar a diferentes SGBDs, e essas extensões incluem os drivers necessários para cada SGBD.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplos de Conexão com MySQL em PHP
&lt;/h3&gt;

&lt;p&gt;Em PHP, a conexão com um banco de dados é frequentemente feita usando drivers específicos. Aqui estão dois exemplos de como se conectar a um banco de dados MySQL e PostgreSQL usando as extensões &lt;code&gt;mysqli&lt;/code&gt; e &lt;code&gt;PDO&lt;/code&gt;:&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;mysqli&lt;/code&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class="nv"&gt;$host&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"localhost"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// host onde o servidor de MySQL estará escutando&lt;/span&gt;
&lt;span class="nv"&gt;$port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3306&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// porta TCP onde o servidor escuta&lt;/span&gt;
&lt;span class="nv"&gt;$username&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"seu_usuario"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// usuário do SGBD&lt;/span&gt;
&lt;span class="nv"&gt;$password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"sua_senha"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// senha do usuário&lt;/span&gt;
&lt;span class="nv"&gt;$database&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"seu_banco"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// base de dados que será utilizada&lt;/span&gt;

&lt;span class="c1"&gt;// Criar uma conexão&lt;/span&gt;
&lt;span class="nv"&gt;$mysqli&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;mysqli&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$password&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$database&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$port&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// o argumento $port é opcional; o valor default é a porta padrão (3306 para o MySQL)&lt;/span&gt;

&lt;span class="c1"&gt;// Verificar se a conexão foi bem-sucedida&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$mysqli&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;connect_error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;die&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Erro de conexão: "&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$mysqli&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;connect_error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Exemplo de comando INSERT&lt;/span&gt;
&lt;span class="nv"&gt;$insertQuery&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"INSERT INTO tabela (coluna1, coluna2) VALUES ('valor1', 'valor2')"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$mysqli&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$insertQuery&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Inserção bem-sucedida."&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Erro na inserção: "&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$mysqli&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Exemplo de comando SELECT&lt;/span&gt;
&lt;span class="nv"&gt;$selectQuery&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"SELECT coluna1, coluna2 FROM tabela WHERE algum_criterio"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$mysqli&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$selectQuery&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$result&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;num_rows&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$row&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$result&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;fetch_assoc&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Coluna1: "&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"coluna1"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s2"&gt;" - Coluna2: "&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"coluna2"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;br&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Nenhum resultado encontrado."&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Fechar a conexão&lt;/span&gt;
&lt;span class="nv"&gt;$mysqli&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  PDO
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class="c1"&gt;// Dados de conexão&lt;/span&gt;
&lt;span class="nv"&gt;$host&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"localhost"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3306&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$username&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"seu_usuario"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"sua_senha"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$database&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"seu_banco"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Criar uma conexão&lt;/span&gt;
    &lt;span class="nv"&gt;$pdo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;PDO&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"mysql:host=&lt;/span&gt;&lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="s2"&gt;;port=&lt;/span&gt;&lt;span class="nv"&gt;$port&lt;/span&gt;&lt;span class="s2"&gt;;dbname=&lt;/span&gt;&lt;span class="nv"&gt;$database&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$password&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// a porta aqui também é opcional&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;PDOException&lt;/span&gt; &lt;span class="nv"&gt;$e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;die&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Erro de conexão: "&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$e&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getMessage&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Exemplo de comando INSERT&lt;/span&gt;
&lt;span class="nv"&gt;$insertQuery&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"INSERT INTO tabela (coluna1, coluna2) VALUES (?, ?)"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$stmt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$pdo&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;prepare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$insertQuery&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$valor1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"valor1"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$valor2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"valor2"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$stmt&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nv"&gt;$valor1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$valor2&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Inserção bem-sucedida."&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Exemplo de comando SELECT&lt;/span&gt;
&lt;span class="nv"&gt;$selectQuery&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"SELECT coluna1, coluna2 FROM tabela WHERE algum_criterio"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$stmt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$pdo&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$selectQuery&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$row&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$stmt&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;PDO&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;FETCH_ASSOC&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Coluna1: "&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"coluna1"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s2"&gt;" - Coluna2: "&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"coluna2"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;br&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esses exemplos ilustram como os drivers são usados em PHP para conectar-se a diferentes SGBDs e interagir com eles. Cada linguagem de programação tem suas próprias maneiras de lidar com drivers de banco de dados, mas o princípio geral é semelhante: o driver atua como a interface entre a aplicação e o SGBD, facilitando a comunicação e a manipulação de dados.&lt;/p&gt;

&lt;p&gt;Esses exemplos também são uma base sólida para realizar operações de banco de dados em PHP. Certifique-se de adaptá-los às suas necessidades específicas, substituindo os nomes de tabela, colunas e valores de acordo com o seu banco de dados e aplicação.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Os bancos de dados desempenham um papel central no desenvolvimento web, fornecendo a estrutura para armazenar e recuperar dados de forma eficiente. Compreender os aspectos fundamentais, como a modelagem entidade-relacionamento, é essencial para projetar sistemas de bancos de dados que atendam aos requisitos de desempenho e confiabilidade. Saber conectar aos SGBDs e manipular bancos de dados utilizando linguagens de programação pode ser inicialmente desafiador, por requerer conhecimentos em duas áreas distintas (às vezes mais, quando tratamos de aplicações mais complexas), mas é um aspecto fundamental no desenvolvimento de aplicações em geral, principalmente no universo Web.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Introdução ao Docker: Simplificando a Gestão de Aplicações</title>
      <dc:creator>Ranieri Valença</dc:creator>
      <pubDate>Sat, 19 Aug 2023 15:24:01 +0000</pubDate>
      <link>https://dev.to/ranierivalenca/introducao-ao-docker-simplificando-a-gestao-de-aplicacoes-36h3</link>
      <guid>https://dev.to/ranierivalenca/introducao-ao-docker-simplificando-a-gestao-de-aplicacoes-36h3</guid>
      <description>&lt;h2&gt;
  
  
  Tópicos
&lt;/h2&gt;

&lt;p&gt; 1. Introdução&lt;br&gt;
 2. Revisão de Sistemas Operacionais e Virtualização&lt;br&gt;
       2.1. Kernel do SO&lt;br&gt;
             a. Processos e Isolamento de Processos&lt;br&gt;
             b. Gestão de Memória&lt;br&gt;
             c. Sistema de Arquivos&lt;br&gt;
       2.2. Virtualização&lt;br&gt;
             a. Virtualização de Hardware&lt;br&gt;
             b. Virtualização de Sistema Operacional&lt;br&gt;
 3. O que é Docker?&lt;br&gt;
       3.1. Imagens&lt;br&gt;
       3.2. Container&lt;br&gt;
       3.3. Volumes&lt;br&gt;
       3.4. Redes&lt;br&gt;
       3.5. Compartilhamento de portas com o SO Host&lt;br&gt;
       3.6. Docker Registry&lt;br&gt;
       3.7. Dockerfile&lt;br&gt;
       3.8. Docker compose&lt;br&gt;
 4. Conclusão&lt;/p&gt;
&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Nos últimos anos, o desenvolvimento e a implantação de aplicativos têm sido transformados por tecnologias inovadoras que visam simplificar e agilizar todo o processo. Uma dessas tecnologias que ganhou enorme popularidade é o Docker. Com a capacidade de empacotar, distribuir e executar aplicativos em ambientes isolados, o Docker trouxe uma abordagem revolucionária para a criação de ambientes de desenvolvimento e produção consistentes e escaláveis. Neste artigo, vamos explorar os fundamentos do Docker e como ele está mudando a forma como os aplicativos são desenvolvidos e implantados.&lt;/p&gt;


&lt;h2&gt;
  
  
  Revisão de Sistemas Operacionais e Virtualização
&lt;/h2&gt;

&lt;p&gt;Antes de explorarmos mais a fundo o Docker e seus conceitos, é importante revisarmos alguns aspectos fundamentais dos sistemas operacionais e entender como eles estão relacionados com a virtualização, uma vez que o Docker utiliza uma tecnologia específica de virtualização de containers.&lt;/p&gt;
&lt;h3&gt;
  
  
  Kernel do SO
&lt;/h3&gt;

&lt;p&gt;O Kernel é o núcleo do sistema operacional, responsável por gerenciar recursos e fornecer serviços aos processos e aplicativos. Ele controla o acesso ao hardware, a execução de processos, a alocação de memória, entre outras tarefas essenciais. O kernel atua como uma camada de abstração entre o hardware e os programas em execução. A seguir vamos falar sobre algumas atribuições do Kernel de um Sistema Operacional.&lt;/p&gt;
&lt;h4&gt;
  
  
  Processos e Isolamento de Processos
&lt;/h4&gt;

&lt;p&gt;Um processo é uma instância em execução de um programa. O isolamento de processos é um conceito-chave em sistemas operacionais, que garante que os processos não interfiram uns nos outros. Cada processo possui seu próprio espaço de endereçamento de memória, registradores, pilha e outras estruturas de dados. Isso evita conflitos e garante que um processo não acesse a memória de outro sem permissão.&lt;/p&gt;
&lt;h4&gt;
  
  
  Gestão de Memória
&lt;/h4&gt;

&lt;p&gt;A gestão de memória é crucial para otimizar o uso dos recursos do sistema. Os sistemas operacionais são responsáveis por alocar e desalocar memória para os processos, bem como garantir a proteção da memória entre os processos. Mecanismos como paginação e segmentação são utilizados para permitir o compartilhamento seguro da memória entre processos.&lt;/p&gt;
&lt;h4&gt;
  
  
  Sistema de Arquivos
&lt;/h4&gt;

&lt;p&gt;O sistema de arquivos é a estrutura que organiza e armazena os dados em dispositivos de armazenamento, como discos rígidos e SSDs. Ele permite a criação, leitura, gravação e exclusão de arquivos e diretórios. Os sistemas operacionais fornecem interfaces para acessar e manipular arquivos, gerenciando o armazenamento físico e a hierarquia de diretórios.&lt;/p&gt;
&lt;h3&gt;
  
  
  Virtualização
&lt;/h3&gt;

&lt;p&gt;De forma simplória, a virtualização é uma tecnologia que permite a criação de ambientes isolados e independentes, chamados de máquinas virtuais (VMs), dentro de um sistema hospedeiro. Ela oferece uma forma de executar múltiplos sistemas operacionais ou ambientes de software em uma única máquina física. Dois principais tipos de virtualização são relevantes para entender o Docker:&lt;/p&gt;
&lt;h4&gt;
  
  
  Virtualização de Hardware
&lt;/h4&gt;

&lt;p&gt;Nesse modelo, uma camada de software chamada hipervisor é executada no hardware físico. O hipervisor gerencia a alocação de recursos entre as várias VMs. Cada VM contém um sistema operacional completo, incluindo kernel, processos e bibliotecas. Isso oferece um alto grau de isolamento, mas também pode ser mais pesado em termos de recursos, uma vez que cada VM inclui um sistema operacional completo.&lt;/p&gt;
&lt;h4&gt;
  
  
  Virtualização de Sistema Operacional
&lt;/h4&gt;

&lt;p&gt;Também conhecida como virtualização de containers, essa abordagem compartilha o mesmo kernel entre o sistema hospedeiro e os containers. Os containers isolam processos e ambientes de execução, permitindo a execução de aplicativos em ambientes encapsulados. Isso resulta em menor sobrecarga, pois não há necessidade de múltiplos kernels. A virtualização de containers é mais eficiente em termos de recursos e oferece uma forma ágil de empacotar, distribuir e executar aplicativos.&lt;/p&gt;


&lt;h2&gt;
  
  
  O que é Docker?
&lt;/h2&gt;

&lt;p&gt;O Docker é uma plataforma de código aberto que permite criar, implantar e executar aplicações em containers. Um &lt;em&gt;container&lt;/em&gt; é uma unidade de software que contém todas as dependências necessárias para executar uma aplicação, incluindo o código, bibliotecas, ambientes de tempo de execução e configurações. Essa abordagem de containers possibilita que as aplicações sejam isoladas em ambientes consistentes e portáveis, garantindo que elas funcionem de maneira confiável em diferentes ambientes.&lt;/p&gt;

&lt;p&gt;O Docker opera em um sistema operacional host, que é o sistema operacional do usuário. No caso de sistemas baseados em Unix como Linux ou MacOS, o Docker é executado diretamente sobre o SO nativo. Já no Windows, o Docker pode ser executado através do Hyper-V ou da plataforma de virtualização WSL (Windows Subsystem for Linux) da Microsoft. No caso do uso do WSL, o Docker ainda compartilha o kernel do sistema operacional Linux emulado. Isso proporciona eficiência em termos de recursos, já que os containers não precisam virtualizar todo o hardware.&lt;/p&gt;
&lt;h3&gt;
  
  
  Imagens
&lt;/h3&gt;

&lt;p&gt;As imagens Docker são a espinha dorsal de como o Docker trabalha. Uma imagem é um modelo somente leitura que contém todos os componentes necessários para executar um aplicativo, incluindo o código-fonte, as bibliotecas, as dependências e os arquivos de configuração. Elas servem como base para criar containers.&lt;/p&gt;

&lt;p&gt;Uma imagem é construída a partir de um arquivo chamado &lt;code&gt;Dockerfile&lt;/code&gt;, que contém instruções para definir o ambiente do aplicativo. Ele especifica a partir de qual imagem base começar, quais comandos executar para configurar o ambiente e como o aplicativo será inicializado.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;em&gt;Container&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;Os containers são instâncias em tempo de execução de imagens. Eles encapsulam um ambiente isolado para a execução de um aplicativo, incluindo seu sistema de arquivos, variáveis de ambiente, bibliotecas e processos em execução. Os containers são leves e compartilham o mesmo kernel do sistema operacional host, o que resulta em uma utilização eficiente de recursos.&lt;/p&gt;

&lt;p&gt;Cada container é isolado dos outros, o que significa que os processos em execução em um container não interferem nos processos de outros containers. Isso proporciona uma excelente maneira de garantir a consistência e a separação entre os aplicativos, mesmo quando estão todos sendo executados no mesmo host.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F47oub6xamaaj8qbh66pa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F47oub6xamaaj8qbh66pa.png" alt="virtualization vs containers" width="800" height="506"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Volumes
&lt;/h3&gt;

&lt;p&gt;Os volumes no Docker são mecanismos que permitem persistir dados além do ciclo de vida de um container. Eles são usados para compartilhar dados entre o host e os containers ou entre containers diferentes. Um volume é um diretório ou arquivo no sistema de arquivos do host que é montado em um determinado ponto dentro do container.&lt;/p&gt;

&lt;p&gt;Os volumes são particularmente úteis para armazenar dados que precisam ser mantidos entre a inicialização e o encerramento do container, como bancos de dados ou arquivos de configuração. Eles também são uma forma de compartilhar dados entre containers que precisam colaborar. Além disso, eles podem ser utilizados como forma de manter o código fonte de um software no SO Host, acessível ao desenvolvedor, enquanto sua execução é feita dentro de um container.&lt;/p&gt;
&lt;h3&gt;
  
  
  Redes
&lt;/h3&gt;

&lt;p&gt;As redes Docker permitem a comunicação entre containers em diferentes hosts ou no mesmo host. Elas são usadas para conectar containers que precisam se comunicar uns com os outros, seja para trocar dados ou para formar componentes de um aplicativo distribuído.&lt;/p&gt;

&lt;p&gt;As redes Docker podem ser configuradas para diferentes modos de comunicação, como modo bridge (ponte) para comunicação interna entre containers ou modo host para comunicação direta com a rede do host. Isso permite criar ambientes complexos em que os containers podem se comunicar de maneira eficiente e segura.&lt;/p&gt;
&lt;h3&gt;
  
  
  Compartilhamento de portas com o SO Host
&lt;/h3&gt;

&lt;p&gt;Os containers podem expor portas para o host e para a rede externa. Isso permite que os aplicativos sejam acessados através de interfaces de rede, tornando-os disponíveis para os usuários e para outros sistemas.&lt;/p&gt;
&lt;h3&gt;
  
  
  Docker Registry
&lt;/h3&gt;

&lt;p&gt;O Docker Registry é um repositório para armazenar e compartilhar imagens Docker. Ele é essencial para compartilhar imagens entre desenvolvedores e implantações. O &lt;a href="https://hub.docker.com" rel="noopener noreferrer"&gt;Docker Hub&lt;/a&gt; é um exemplo de um Docker Registry público (repositório padrão), onde você pode encontrar imagens prontas para uso em diferentes cenários.&lt;/p&gt;

&lt;p&gt;Você também pode configurar seu próprio Docker Registry privado para armazenar imagens internamente. Isso é especialmente útil quando você deseja manter o controle sobre as imagens usadas em sua organização ou quando precisa lidar com requisitos de segurança mais rigorosos.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;code&gt;Dockerfile&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Um Dockerfile é um arquivo de texto que contém um conjunto de instruções para criar uma imagem Docker. Ele é a base para construir imagens personalizadas que atendam às necessidades específicas do aplicativo.&lt;/p&gt;

&lt;p&gt;No Dockerfile, você pode especificar uma imagem base, instalar pacotes e bibliotecas adicionais, configurar variáveis de ambiente, copiar arquivos para dentro da imagem e definir como o aplicativo será iniciado. Esse arquivo é usado pelo Docker para automatizar a criação de imagens de maneira consistente e reprodutível.&lt;/p&gt;

&lt;p&gt;A seguir, um exemplo de um &lt;code&gt;Dockerfile&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;# Usar uma imagem base&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; node:14&lt;/span&gt;

&lt;span class="c"&gt;# Definir o diretório de trabalho&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;

&lt;span class="c"&gt;# Copiar os arquivos de configuração&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; package.json package-lock.json /app/&lt;/span&gt;

&lt;span class="c"&gt;# Instalar as dependências&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt;

&lt;span class="c"&gt;# Copiar o restante dos arquivos da aplicação&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . /app/&lt;/span&gt;

&lt;span class="c"&gt;# Expor a porta que a aplicação irá escutar&lt;/span&gt;
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 3000&lt;/span&gt;

&lt;span class="c"&gt;# Comando para iniciar a aplicação&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["npm", "start"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Docker compose
&lt;/h3&gt;

&lt;p&gt;O Docker Compose é uma ferramenta que permite definir e executar aplicativos compostos por vários containers. Com um único arquivo de configuração, é possível definir a estrutura do aplicativo, suas dependências e como eles devem se comunicar.&lt;/p&gt;

&lt;p&gt;O arquivo de configuração do Docker Compose é escrito em YAML (&lt;strong&gt;&lt;code&gt;docker-compose.yml&lt;/code&gt;&lt;/strong&gt;) e pode definir vários serviços, redes e volumes. Ele fornece uma maneira fácil de iniciar e gerenciar aplicativos complexos, permitindo que você descreva a arquitetura do aplicativo e suas interações de forma clara e concisa.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h4&gt;
  
  
  Linguagem YAML (YAML Ain't Markup Language)
&lt;/h4&gt;

&lt;p&gt;YAML é uma linguagem de marcação leve que é frequentemente utilizada para configuração de dados estruturados. Ela é bastante legível para humanos e utiliza espaços e indentação para definir a estrutura dos dados. O YAML é comumente usado em arquivos de configuração, como o docker-compose.yml, para definir serviços, configurações e relacionamentos entre diferentes componentes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A seguir, dois exemplos de arquivos &lt;code&gt;docker-compose.yml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3'&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;webapp&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;  &lt;span class="c1"&gt;# Diretório onde está localizado o Dockerfile&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3000:3000'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, estamos definindo um serviço chamado 'webapp'. Estamos indicando que ele deve ser construído usando o Dockerfile no mesmo diretório (&lt;code&gt;context: .&lt;/code&gt;) e mapeando a porta 3000 do host para a porta 3000 do container.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3'&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;mysql&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mysql:5.7&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;MYSQL_ROOT_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mysecretpassword&lt;/span&gt;
      &lt;span class="na"&gt;MYSQL_DATABASE&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mydatabase&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;mysql-data:/var/lib/mysql&lt;/span&gt;

  &lt;span class="na"&gt;webapp&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;php:7.4-apache&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;80:80'&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./webapp:/var/www/html&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;mysql&lt;/span&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;mysql-data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Já neste exemplo, temos dois serviços: mysql e webapp.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;O serviço mysql utiliza a imagem oficial do MySQL 5.7 e configura algumas variáveis de ambiente, como a senha do root e o nome do banco de dados. O uso de volumes permite persistir os dados do banco de dados fora do container.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;O serviço webapp utiliza a imagem oficial do PHP 7.4 com o servidor Apache. Ele mapeia a porta 80 do host para a porta 80 do container e monta o diretório local &lt;code&gt;./webapp&lt;/code&gt; no diretório &lt;code&gt;/var/www/html&lt;/code&gt; do container. Isso permite que você desenvolva a aplicação localmente e veja as alterações refletidas imediatamente no container.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Além disso, o serviço webapp depende do serviço mysql, o que garante que o container do banco de dados esteja em execução antes do container da aplicação web.&lt;/p&gt;

&lt;p&gt;Por fim, um volume chamado mysql-data é definido para persistir os dados do banco de dados em um volume Docker, tornando os dados persistentes mesmo quando os containers são reiniciados ou atualizados.&lt;/p&gt;

&lt;p&gt;O Docker Compose simplifica a criação e gerenciamento de ambientes de desenvolvimento complexos, permitindo que você defina e execute vários serviços interconectados com facilidade.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;A revolução trazida pelo Docker na forma como desenvolvemos, implantamos e gerenciamos aplicativos é inegável. Com uma abordagem baseada em containers, o Docker fornece uma maneira eficiente de criar, distribuir e executar aplicativos em ambientes isolados e consistentes. O uso de imagens, containers, volumes, redes e outras funcionalidades do Docker permite uma maior portabilidade, escalabilidade e facilidade de implantação.&lt;/p&gt;

&lt;p&gt;Além disso, a compreensão dos conceitos fundamentais de sistemas operacionais, como o papel do kernel, isolamento de processos, gestão de memória e sistema de arquivos, é crucial para aproveitar ao máximo os benefícios oferecidos pelo Docker. A virtualização, tanto a de hardware quanto a de sistema operacional, também desempenha um papel fundamental na compreensão das tecnologias subjacentes ao Docker e de como ele consegue fornecer ambientes isolados de maneira eficiente.&lt;/p&gt;

&lt;p&gt;O Dockerfile e o Docker Compose são ferramentas poderosas que simplificam a criação e o gerenciamento de ambientes de desenvolvimento complexos. O uso do Docker Registry, seja público ou privado, amplia ainda mais a flexibilidade e a eficiência do desenvolvimento e implantação de aplicativos.&lt;/p&gt;

&lt;p&gt;Em resumo, o Docker representa um divisor de águas na maneira como desenvolvemos e entregamos software. Sua abordagem baseada em containers oferece uma solução altamente eficiente e flexível para a criação e execução de aplicativos, independentemente do ambiente em que serão implantados. Portanto, investir tempo para entender os conceitos por trás do Docker e aprender a trabalhar com suas ferramentas pode ser extremamente benéfico para profissionais de desenvolvimento, operações e outras áreas relacionadas.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Front-End, Back-End, CRUD, REST, APIs e outros conceitos importantes sobre Desenvolvimento Web</title>
      <dc:creator>Ranieri Valença</dc:creator>
      <pubDate>Wed, 02 Aug 2023 18:04:42 +0000</pubDate>
      <link>https://dev.to/ranierivalenca/front-end-back-end-crud-rest-apis-e-outros-conceitos-importantes-sobre-desenvolvimento-web-1j3i</link>
      <guid>https://dev.to/ranierivalenca/front-end-back-end-crud-rest-apis-e-outros-conceitos-importantes-sobre-desenvolvimento-web-1j3i</guid>
      <description>&lt;h2&gt;
  
  
  Tópicos
&lt;/h2&gt;

&lt;p&gt; 1. Front-End e Back-End: Entendendo as Diferenças&lt;br&gt;
       1.1. Front-End&lt;br&gt;
             a. Principais Responsabilidades do Front-End&lt;br&gt;
       1.2. Back-End&lt;br&gt;
             a. Principais Responsabilidades do Back-End&lt;br&gt;
       1.3. Integração Front-End e Back-End&lt;br&gt;
 2. CRUD - Create, Read, Update e Delete&lt;br&gt;
       2.1. CRUD no Back-End e Interação com Fontes de Dados&lt;br&gt;
       2.2. CRUD do Ponto de Vista do Usuário&lt;br&gt;
 3. API&lt;br&gt;
 4. REST&lt;br&gt;
 5. Tokens, JWT e seu Uso com APIs REST&lt;br&gt;
 6. Outros Modelos de API&lt;br&gt;
 7. Conclusão&lt;/p&gt;

&lt;h2&gt;
  
  
  Front-End e Back-End: Entendendo as Diferenças
&lt;/h2&gt;

&lt;p&gt;No desenvolvimento de aplicações web, é comum encontrar dois termos fundamentais: Front-End e Back-End. Esses termos se referem a diferentes camadas de uma aplicação e descrevem as responsabilidades e funções específicas de cada uma. Compreender as diferenças entre Front-End e Back-End é essencial para entender a estrutura geral de uma aplicação web e como suas diferentes partes interagem.&lt;/p&gt;

&lt;h3&gt;
  
  
  Front-End
&lt;/h3&gt;

&lt;p&gt;O Front-End é a parte da aplicação web com a qual os usuários interagem diretamente. Ele é responsável por apresentar o conteúdo e a interface visual da aplicação, tornando-a acessível e amigável aos usuários. Os desenvolvedores de Front-End utilizam tecnologias como HTML, CSS e JavaScript para construir a interface gráfica e a experiência do usuário.&lt;/p&gt;

&lt;h4&gt;
  
  
  Principais Responsabilidades do Front-End
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Estrutura e Conteúdo&lt;/strong&gt;: O HTML (HyperText Markup Language) é usado para criar a estrutura básica da página e definir o conteúdo, como texto, imagens e vídeos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Estilo e Layout&lt;/strong&gt;: O CSS (Cascading Style Sheets) é responsável pela aparência visual da página, incluindo cores, fontes, tamanhos, posicionamento de elementos e layouts responsivos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Interatividade&lt;/strong&gt;: O JavaScript é utilizado para tornar a página interativa, permitindo que os elementos respondam a ações do usuário, como cliques, arrastar e soltar, animações e muito mais, além de ser utilizado para manipulação de dados antes do envio ao back-end.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Compatibilidade com Dispositivos&lt;/strong&gt;: O Front-End deve garantir que a aplicação funcione de forma adequada em diferentes dispositivos, como computadores, tablets e smartphones. Isso é geralmente resultante de interações do CSS com o JavaScript.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Back-End
&lt;/h3&gt;

&lt;p&gt;O Back-End é a parte "invisível" da aplicação web, que fica nos bastidores (em aplicações web, esta é a parte que fica hospedada em um servidor) e é responsável por gerenciar a lógica de negócios, o processamento de dados e a interação com fontes externas (apesar desta interação também poder ser feita, em alguns casos, diretamente do front-end com a ajuda de JavaScript e das APIs do navegador), como bancos de dados e serviços de terceiros. Os desenvolvedores de Back-End trabalham principalmente com linguagens de programação como PHP, Python, Ruby, Java, Node.js, entre outras.&lt;/p&gt;

&lt;h4&gt;
  
  
  Principais Responsabilidades do Back-End
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Lógica de Negócios&lt;/strong&gt;: O Back-End é responsável por implementar as regras de negócio da aplicação, como cálculos, validações e processamento de dados.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Armazenamento e Recuperação de Dados&lt;/strong&gt;: O Back-End gerencia a interação com o banco de dados ou outra fonte de dados (como por exemplo arquivos CSV), permitindo a criação, leitura, atualização e exclusão de dados (operações CRUD).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Autenticação e Segurança&lt;/strong&gt;: É no Back-End que são implementados os sistemas de autenticação e autorização para garantir que apenas usuários autorizados tenham acesso a determinados recursos e informações sensíveis.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Integração de APIs&lt;/strong&gt;: O Back-End pode interagir com serviços de terceiros ou outras APIs, permitindo que a aplicação acesse recursos externos, como envio de e-mails, integração com redes sociais, entre outros.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Integração Front-End e Back-End
&lt;/h3&gt;

&lt;p&gt;Uma aplicação web bem-sucedida requer uma estreita integração entre o Front-End e o Back-End. O Front-End precisa se comunicar com o Back-End para enviar e receber dados, realizar ações e atualizar a interface em tempo real. Isso é frequentemente feito por meio de chamadas de API, onde o Front-End envia solicitações ao Back-End para obter ou enviar informações.&lt;/p&gt;

&lt;p&gt;A separação entre Front-End e Back-End permite que diferentes equipes de desenvolvimento trabalhem em paralelo, tornando o processo de desenvolvimento mais eficiente e organizado. Além disso, essa divisão de responsabilidades facilita a manutenção, atualização e escalabilidade da aplicação à medida que ela cresce e evolui.&lt;/p&gt;

&lt;p&gt;É importante frisar que, a depender das escolhas de projeto durante o desenvolvimento, nem sempre é possível garantir esta separação. Por exemplo, em aplicações mais simples utilizando PHP (como a que vamos construir em breve), quando o usuário fizer uma requisição para o servidor, este retornará uma resposta com seus conteúdos HTML, CSS e JavaScript, resposta esta que irá gerar o front-end ao chegar no cliente.&lt;/p&gt;




&lt;p&gt;Em resumo, pode-se dizer que &lt;em&gt;front-end&lt;/em&gt; é aquilo com o que o usuário interage, o HTML e CSS utilizado para renderizar a interface gráfica no navegador e o JavaScript que lida com as ações do usuário &lt;strong&gt;no lado do cliente&lt;/strong&gt;. Já o &lt;em&gt;back-end&lt;/em&gt; é o código que fica hospedado no servidor e que é executado quando o mesmo recebe uma requisição.&lt;/p&gt;




&lt;h2&gt;
  
  
  CRUD - Create, Read, Update e Delete
&lt;/h2&gt;

&lt;p&gt;O CRUD é uma sigla que representa as quatro principais operações básicas em sistemas de gerenciamento de informações:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create (criar)&lt;/li&gt;
&lt;li&gt;Read (ler)&lt;/li&gt;
&lt;li&gt;Update (atualizar)&lt;/li&gt;
&lt;li&gt;Delete (excluir).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Essas operações são amplamente utilizadas em aplicações web para manipular dados em um sistema.&lt;/p&gt;

&lt;h3&gt;
  
  
  CRUD no Back-End e Interação com Fontes de Dados
&lt;/h3&gt;

&lt;p&gt;No contexto do desenvolvimento web, o CRUD é frequentemente implementado no back-end, que é a parte da aplicação que lida com o processamento dos dados e a interação com fontes de dados, como bancos de dados, arquivos CSV e outros serviços externos.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Create&lt;/strong&gt;: Ao criar dados, o back-end recebe as informações enviadas pelo usuário (por meio de formulários ou chamadas de API) e as insere em um banco de dados ou outro repositório de armazenamento adequado.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Read&lt;/strong&gt;: A operação de leitura envolve recuperar dados existentes do banco de dados ou fonte de dados correspondente e enviá-los de volta ao cliente (front-end) para exibição ou processamento adicional.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: Quando o usuário deseja modificar dados existentes, o back-end recebe a solicitação, verifica a validade das informações enviadas e, em seguida, atualiza os dados correspondentes no banco de dados.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Delete&lt;/strong&gt;: A exclusão envolve remover dados específicos do banco de dados ou repositório de armazenamento, conforme solicitado pelo usuário.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  CRUD do Ponto de Vista do Usuário
&lt;/h3&gt;

&lt;p&gt;As operações de CRUD são geralmente realizadas em resposta às ações do usuário. Algumas vezes podemos ter sistemas onde estas operações são bem claras, com formulários específicos para tal. Entretanto, algumas ações do usuário podem levar a operações de CRUD de forma não explícita, como nos seguintes exemplos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Sistema de Busca&lt;/strong&gt;: Quando o usuário realiza uma busca, o back-end recebe a consulta, processa-a e retorna os resultados relevantes, seguindo a operação de leitura (Read).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Atualização de Status&lt;/strong&gt;: Em algumas plataformas, o usuário pode alterar seu status para "Disponível", "Ocupado", entre outros. Esta simples alteração envia ao servidor o novo status que o usuário deseja e o back-end realiza uma operação de atualização (Update).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Adição ou Remoção de Comentários&lt;/strong&gt;: Em plataformas de mídia social ou blogs, os usuários podem adicionar ou remover comentários em publicações existentes. Quando isso acontece, o back-end realiza a operação de criação (Create) ou exclusão (Delete) de comentários correspondentes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Like e avaliações&lt;/strong&gt;: Em algumas redes sociais é possível dar uma nota (&lt;em&gt;rate&lt;/em&gt;) para um determinado recurso (por exemplo, escolher entre 1 a 5 estrelas para um produto) ou "dar um like" em alguma postagem. Estas operações geralmente envolvem a criação (Create) ou exclusão (Delete) de registros no banco de dados ou repositório, relacionando o usuário à postagem ou produto.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  API
&lt;/h2&gt;

&lt;p&gt;API é a sigla para "Interface de Programação de Aplicações" (Application Programming Interface, em inglês). É um conjunto de regras e protocolos que permite que diferentes aplicações se comuniquem entre si. As APIs definem os métodos e formatos de dados que podem ser utilizados para interagir com um sistema específico.&lt;/p&gt;

&lt;p&gt;Uma API pode ser usada para permitir que aplicações externas acessem os recursos e funcionalidades de um sistema sem precisar conhecer a implementação interna desse sistema. Isso promove a modularidade, reutilização de código e integração de sistemas diferentes.&lt;/p&gt;

&lt;p&gt;Portanto, o termo API é genérico o suficiente para incluir os diversos mecanismo de comunicação entre sistemas. Por exemplo, um Sistema Operacional fornece uma API para as linguagens de programação de baixo nível acessarem as interfaces de rede, ou acessarem o sistema de arquivos (como acontece quando usando a função &lt;code&gt;fopen()&lt;/code&gt; do PHP, que solicita à API do Sistema Operacional um manipulador de arquivo).&lt;/p&gt;

&lt;p&gt;Entretanto, no mundo do Desenvolvimento Web, o termo API é bastante utilizado para APIs REST, que veremos a seguir.&lt;/p&gt;

&lt;h2&gt;
  
  
  REST
&lt;/h2&gt;

&lt;p&gt;REST é um estilo de arquitetura de software para sistemas distribuídos, geralmente utilizado na construção de APIs para aplicações web. REST é a sigla para "Representational State Transfer" (Transferência de Estado Representacional, em português).&lt;/p&gt;

&lt;p&gt;Os princípios fundamentais do REST incluem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Recursos Identificáveis&lt;/strong&gt;: Cada recurso (como uma entidade em um banco de dados) deve ter um identificador único (URI) para acessá-lo de forma exclusiva.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Operações Baseadas em Métodos HTTP&lt;/strong&gt;: As operações CRUD são mapeadas para os métodos HTTP: Create (POST), Read (GET), Update (PUT/PATCH) e Delete (DELETE).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Uso de HATEOAS&lt;/strong&gt;: Hypermedia as the Engine of Application State (HATEOAS) é um princípio que sugere que as respostas das APIs devem conter links que permitem aos clientes descobrir e navegar para recursos relacionados.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Stateless (Sem Estado)&lt;/strong&gt;: Cada solicitação para o servidor deve conter todas as informações necessárias para compreender e processar a requisição. O servidor não deve armazenar o estado da sessão do cliente entre as requisições.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O REST facilita a criação de APIs escaláveis, flexíveis e de fácil manutenção, permitindo que diferentes aplicações se comuniquem de forma padronizada e eficiente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tokens, JWT e seu Uso com APIs REST
&lt;/h2&gt;

&lt;p&gt;Tokens são uma forma de autenticação amplamente utilizada em aplicações web e APIs REST. Um token é uma sequência de caracteres que representa a autorização para acessar recursos ou executar operações específicas.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Token de Acesso&lt;/strong&gt;: Um token de acesso é gerado após o usuário efetuar login e é enviado em cada requisição para a API. Ele permite que o cliente acesse recursos protegidos e realiza a autenticação do usuário em cada solicitação.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;JSON Web Token (JWT)&lt;/strong&gt;: O JWT é um formato padrão para representar informações do usuário de forma segura entre duas partes. Ele é assinado digitalmente, o que garante que os dados no token não foram alterados após a sua criação.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O uso de tokens, como o JWT, é uma alternativa eficiente e segura para a autenticação de usuários em APIs REST. Em vez de depender de sessões no servidor, o token é armazenado no cliente (por exemplo, no armazenamento local ou em um cookie) e enviado em cada requisição. Isso torna a API mais escalável e não dependente de estado, permitindo fácil implementação de autenticação para aplicativos e serviços distribuídos.&lt;/p&gt;

&lt;p&gt;Além do JWT (JSON Web Token), existem outros tipos de tokens utilizados em diferentes contextos no desenvolvimento web. Alguns exemplos incluem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tokens de Autenticação&lt;/strong&gt;: São tokens usados para autenticar usuários e conceder acesso a recursos protegidos em uma aplicação. Além do JWT, outros formatos de token, como OAuth tokens e SAML tokens, são amplamente utilizados para autenticação e autorização em aplicações.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tokens de Acesso&lt;/strong&gt;: São tokens temporários que fornecem acesso a recursos ou serviços específicos em uma API. Eles são comumente usados em integrações de terceiros, onde os tokens são emitidos para clientes autorizados e revogados após um período de tempo ou quando o acesso é encerrado.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;*&lt;em&gt;Tokens de Atualização&lt;/em&gt;: São tokens utilizados em processos de autenticação em dois passos (2FA - &lt;em&gt;2 Factor Authentication&lt;/em&gt;). Após o usuário fornecer suas credenciais iniciais, um token de atualização é solicitado para confirmar a autenticação antes de conceder o acesso total à conta.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tokens de Recuperação de Senha&lt;/strong&gt;: São tokens gerados e enviados ao usuário para permitir a redefinição de senhas em caso de esquecimento. Esses tokens têm validade limitada e fornecem uma camada adicional de segurança ao processo de recuperação de conta.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Outros Modelos de API
&lt;/h2&gt;

&lt;p&gt;Além do REST, existem outros modelos de API que podem ser utilizados em desenvolvimento web, como por exemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;GraphQL&lt;/strong&gt;: É uma linguagem de consulta e manipulação de dados desenvolvida pelo Facebook. Com o GraphQL, o cliente pode especificar exatamente quais dados ele precisa, evitando sobrecarga de dados e tornando as requisições mais eficientes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;SOAP&lt;/strong&gt;: É um protocolo mais antigo baseado em XML, amplamente utilizado em integrações corporativas. SOAP define uma estrutura rígida para as mensagens e é considerado mais pesado e complexo em comparação com as abordagens mais modernas, como REST e GraphQL.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cada modelo de API tem suas próprias vantagens e pode ser mais adequado para diferentes cenários e requisitos específicos de uma aplicação. A escolha do modelo de API dependerá da complexidade do projeto, do tamanho da equipe de desenvolvimento, dos requisitos de performance e dos objetivos globais da aplicação.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Estes são alguns do conceitos mais fundamentais no mundo do Desenvolvimento Web, que todo desenvolvedor deve ter ciência. Obviamente este artigo fornece uma visão geral, e há muito mais detalhes a serem explorados sobre cada um destes tópicos, como por exemplo o funcionamento dos navegadores ao renderizar o front-end e como ele lida com as ações do usuário. Alguns destes tópicos serão abordados futuramente nesta série.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Cookies e Sessão - conceitos e utilização com PHP</title>
      <dc:creator>Ranieri Valença</dc:creator>
      <pubDate>Fri, 28 Jul 2023 02:18:39 +0000</pubDate>
      <link>https://dev.to/ranierivalenca/cookies-e-sessao-conceitos-e-utilizacao-com-php-kok</link>
      <guid>https://dev.to/ranierivalenca/cookies-e-sessao-conceitos-e-utilizacao-com-php-kok</guid>
      <description>&lt;h2&gt;
  
  
  Tópicos
&lt;/h2&gt;

&lt;p&gt; 1. Introdução&lt;br&gt;
 2. Cookies&lt;br&gt;
       2.1. Conceito&lt;br&gt;
       2.2. Manipulação&lt;br&gt;
             a. Criação de Cookies&lt;br&gt;
             b. Leitura de Cookies&lt;br&gt;
             c. Exclusão de Cookies&lt;br&gt;
       2.3. Exemplo em PHP&lt;br&gt;
 3. Sessões&lt;br&gt;
       3.1. Conceito&lt;br&gt;
       3.2. Manipulação&lt;br&gt;
             a. Criação de Sessões&lt;br&gt;
             b. Leitura de Sessões&lt;br&gt;
             c. Exclusão de Sessões&lt;br&gt;
       3.3. Exemplo em PHP&lt;br&gt;
 4. Conclusão&lt;/p&gt;
&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;A palavra "sessão" em português é curiosa, pois tem a mesma sonoridade que cessão, seção e é muito similar à secção, cujos significados são completamente distintos. No contexto de Aplicações Web, o termo sessão representa um espaço de tempo durante o qual uma atividade específica é realizada, como a interação do usuário com um ambiente de web-email ou uma rede social.&lt;/p&gt;

&lt;p&gt;Entretanto, o protocolo HTTP utilizado em Aplicações Web é stateless, o que significa que ele não mantém informações de estado ou identificação sobre quem está fazendo a requisição. Em aplicações mais complexas, essas informações são essenciais para personalizar a experiência do usuário e fornecer conteúdo relevante. Por exemplo, em uma rede social, é necessário saber quem está fazendo a requisição para gerar um feed personalizado para aquele usuário. É neste contexto que entram os Cookies e as Sessões.&lt;/p&gt;
&lt;h2&gt;
  
  
  Cookies
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Conceito
&lt;/h3&gt;

&lt;p&gt;Cookies são pequenos arquivos de texto armazenados no navegador do usuário. Eles foram criados para resolver o desafio da falta de estado (&lt;em&gt;statelessness&lt;/em&gt;) no protocolo HTTP. Quando o servidor envia uma resposta para o navegador com o intuito de criar um cookie, o navegador armazena esses dados e, em seguida, envia-os de volta para o servidor em todas as requisições subsequentes relacionadas ao mesmo domínio. Dessa forma, os cookies permitem que as aplicações web mantenham informações sobre o usuário em requisições sucessivas ou até mesmo após ele navegar para outras páginas ou fechar o navegador.&lt;/p&gt;
&lt;h3&gt;
  
  
  Manipulação
&lt;/h3&gt;

&lt;p&gt;A manipulação de cookies envolve três principais ações: criação, leitura e exclusão.&lt;/p&gt;
&lt;h4&gt;
  
  
  Criação de Cookies
&lt;/h4&gt;

&lt;p&gt;Para criar um cookie, após uma requisição, o servidor envia um cabeçalho HTTP com a resposta que contém os dados do cookie que deseja armazenar no navegador do usuário. Esse cabeçalho geralmente é chamado de "Set-Cookie". Ele pode conter informações como nome, valor, data de expiração, domínio e caminho. Esses dados serão armazenados no navegador do usuário e enviados de volta para o servidor em todas as requisições futuras relacionadas ao mesmo domínio.&lt;/p&gt;
&lt;h4&gt;
  
  
  Leitura de Cookies
&lt;/h4&gt;

&lt;p&gt;Quando o usuário navega para outras páginas ou faz novas requisições ao mesmo domínio, o navegador envia automaticamente os cookies relacionados a esse domínio no cabeçalho da requisição HTTP. O servidor pode então ler esses cookies e utilizar as informações armazenadas para personalizar a experiência do usuário ou fornecer conteúdo relevante.&lt;/p&gt;
&lt;h4&gt;
  
  
  Exclusão de Cookies
&lt;/h4&gt;

&lt;p&gt;Para excluir um cookie, o servidor envia uma resposta HTTP com um cabeçalho "Set-Cookie" que instrui o navegador a remover o cookie do armazenamento local. Para fazer isso, geralmente é definida uma data de expiração passada, o que faz com que o cookie seja considerado inválido e, portanto, excluído pelo navegador.&lt;/p&gt;
&lt;h3&gt;
  
  
  Exemplo em PHP
&lt;/h3&gt;

&lt;p&gt;Considere os seguintes códigos em PHP:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- set_cookie.php --&amp;gt;&lt;/span&gt;
&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class="c1"&gt;// Criando um cookie com o nome "usuario" e o valor "joao123"&lt;/span&gt;
&lt;span class="nb"&gt;setcookie&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"usuario"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"joao123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;86400&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s2"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Setando o código de resposta para 302 - Found&lt;/span&gt;
&lt;span class="nb"&gt;http_response_code&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;302&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Adicionando o cabeçalho 'Location', que informará ao browser para onde o usuário deve ser redirecionado (qual o próximo request que deve ser feito)&lt;/span&gt;
&lt;span class="nb"&gt;header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Location: /'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- index.php --&amp;gt;&lt;/span&gt;
&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class="c1"&gt;// Verificando se o cookie "usuario" está definido&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;isset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$_COOKIE&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'usuario'&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Obtendo o valor do cookie&lt;/span&gt;
    &lt;span class="nv"&gt;$usuario&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$_COOKIE&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'usuario'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Bem-vindo de volta, &lt;/span&gt;&lt;span class="nv"&gt;$usuario&lt;/span&gt;&lt;span class="s2"&gt;!"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Olá, visitante!"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Caso o cookie não esteja definido&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Suponha que estes dois arquivos estão num diretório e que este é o diretório raiz de um servidor embutido do PHP escutando na porta &lt;code&gt;8080&lt;/code&gt;. Neste caso, quando o usuário fizer a primeira requisição para &lt;code&gt;http://localhost:8080&lt;/code&gt;, o arquivo &lt;code&gt;index.php&lt;/code&gt; será executado, e considerando o cenário que não há nenhum cookie salvo (o que acontece, por exemplo, quando se abre uma página usando a navegação anônima), a condição do &lt;code&gt;if&lt;/code&gt; será falsa e será respondido "Olá, visitante". &lt;/p&gt;

&lt;p&gt;Agora, considere que o usuário digitou em sua barra de endereço &lt;code&gt;http://localhost:8080/set_cookie.php&lt;/code&gt;. Quando a requisição chegar no servidor, o código do arquivo &lt;code&gt;set_cookie.php&lt;/code&gt; será executado e irá adicionar o cabeçalho "Set-Cookie" (através da função &lt;a href="https://www.php.net/manual/pt_BR/function.setcookie.php" rel="noopener noreferrer"&gt;&lt;code&gt;setcookie()&lt;/code&gt;&lt;/a&gt;, o cabeçalho "Location" utilizando a função &lt;a href="https://www.php.net/manual/pt_BR/function.header.php" rel="noopener noreferrer"&gt;&lt;code&gt;header()&lt;/code&gt;&lt;/a&gt; e alterar o código de resposta para 302 (&lt;em&gt;Found&lt;/em&gt;). Com isso, o navegador fará duas coisas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Adicionar o cookie "usuario" com o valor "joao123", que expirará em 30 dias (86400 == um dia).&lt;/li&gt;
&lt;li&gt;Com o código de resposta de redirecionamento, fará uma nova requisição para a URI contida no cabeçalho "Location" (&lt;code&gt;/&lt;/code&gt;).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Nesta nova requisição o cookie &lt;code&gt;usuario=joao123&lt;/code&gt; será adicionado como um cabeçalho extra no pacote HTTP, já que sua data de expiração é posterior à data atual. Isso fará com que o código do &lt;code&gt;if&lt;/code&gt; seja executado, já que nesta requisição há um cookie chamado "usuario". Note que o PHP utiliza a variável superglobal &lt;code&gt;$_COOKIE&lt;/code&gt;, que se comporta como um array associativo de forma similar às variáveis &lt;code&gt;$_GET&lt;/code&gt; e &lt;code&gt;$_POST&lt;/code&gt;, acessando dados provenientes do pacote HTTP da requisição. Para mais informações, você pode ler a documentação &lt;a href="https://www.php.net/manual/pt_BR/reserved.variables.cookies" rel="noopener noreferrer"&gt;$_COOKIE no manual do PHP&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Para mais informações sobre cookies, você pode acessar a página de &lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/HTTP/Cookies" rel="noopener noreferrer"&gt;Cookies HTTP no MDN&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Sessões
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Conceito
&lt;/h3&gt;

&lt;p&gt;As sessões são uma abstração mais amigável e segura para gerenciar informações de estado do que os cookies. Enquanto os cookies são armazenados no lado do cliente, as sessões são armazenadas no servidor. Um cookie é usado para rastrear a sessão do usuário, mas os dados da sessão em si são armazenados no servidor, não no cookie.&lt;/p&gt;

&lt;h3&gt;
  
  
  Manipulação
&lt;/h3&gt;

&lt;p&gt;A manipulação de sessões também envolve três ações principais: criação, leitura e exclusão.&lt;/p&gt;

&lt;h4&gt;
  
  
  Criação de Sessões
&lt;/h4&gt;

&lt;p&gt;Ao criar uma sessão, o servidor gera um identificador exclusivo chamado "&lt;em&gt;session ID&lt;/em&gt;" e o envia para o navegador do usuário por meio de um cookie (geralmente chamado de "PHPSESSID" em aplicações PHP). Esse cookie contém o ID da sessão, que é usado para identificar a sessão no servidor.&lt;/p&gt;

&lt;h4&gt;
  
  
  Leitura de Sessões
&lt;/h4&gt;

&lt;p&gt;Quando o usuário faz uma requisição ao servidor, o navegador envia o cookie contendo o &lt;em&gt;session ID&lt;/em&gt; associado à sessão atual. O servidor usa esse &lt;em&gt;session ID&lt;/em&gt; para recuperar os dados da sessão correspondentes armazenados em seu sistema. Isso permite que o servidor identifique o usuário e acesse as informações da sessão associadas. Em PHP isso é feito através da combinação da função &lt;code&gt;session_start()&lt;/code&gt; e da variável superglobal &lt;code&gt;$_SESSION&lt;/code&gt;, conforme será exemplificado a seguir.&lt;/p&gt;

&lt;h4&gt;
  
  
  Exclusão de Sessões
&lt;/h4&gt;

&lt;p&gt;A exclusão de uma sessão geralmente ocorre quando o usuário encerra sua interação com a aplicação ou quando a sessão expira por inatividade (ou seja, quando o cookie contendo o &lt;em&gt;session ID&lt;/em&gt; expira). Nesse momento, o servidor pode limpar os dados da sessão armazenados no servidor e instruir o navegador a excluir o cookie contendo o &lt;em&gt;session ID&lt;/em&gt;, invalidando assim a sessão atual. Em PHP isso pode ser feito através da função &lt;a href="https://www.php.net/manual/pt_BR/function.session-destroy.php" rel="noopener noreferrer"&gt;&lt;code&gt;session_destroy()&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo em PHP
&lt;/h3&gt;

&lt;p&gt;Vamos agora reescrever o código do exemplo anterior utilizando uma sessão ao invés do cookie para armazenar o nome do usuário. Para isso, considere os seguintes códigos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- set_session.php --&amp;gt;&lt;/span&gt;
&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class="c1"&gt;// Iniciando a sessão&lt;/span&gt;
&lt;span class="nb"&gt;session_start&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Armazenando dados na sessão&lt;/span&gt;
&lt;span class="nv"&gt;$_SESSION&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'usuario'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"maria123"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nb"&gt;http_response_code&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;302&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nb"&gt;header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Location: /'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- index.php --&amp;gt;&lt;/span&gt;
&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class="c1"&gt;// Iniciando a sessão&lt;/span&gt;
&lt;span class="nb"&gt;session_start&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Verificando se o valor 'usuario' está definido na sessão&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;isset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$_SESSION&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'usuario'&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Obtendo e exibindo o valor armazenado&lt;/span&gt;
    &lt;span class="nv"&gt;$usuario&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$_SESSION&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'usuario'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Bem-vind@, &lt;/span&gt;&lt;span class="nv"&gt;$usuario&lt;/span&gt;&lt;span class="s2"&gt;!"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Olá, visitante!"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Caso o valor 'nome' não esteja definido na sessão&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, considerando o mesmo ambiente do exemplo anterior, quando a primeira requisição for feita para &lt;code&gt;http://localhost:8080&lt;/code&gt; a função &lt;a href="https://www.php.net/manual/pt_BR/function.session-start" rel="noopener noreferrer"&gt;&lt;code&gt;session_start()&lt;/code&gt;&lt;/a&gt; irá verificar que não existe um cookie contendo um &lt;em&gt;session ID&lt;/em&gt;. Com isso, ela irá criar uma nova sessão, com seu &lt;em&gt;session ID&lt;/em&gt;, e adicioná-lo no cabeçalho da resposta ao cliente. Ainda assim, a condição do &lt;code&gt;if&lt;/code&gt; será falsa, pois a sessão (representada no PHP por um array associativo, guardado na variável superglobal &lt;code&gt;$_SESSION&lt;/code&gt;) está vazia. Assim, a resposta será "Olá, visitante!", da mesma forma que antes, mas com uma diferença: desta vez há um cookie sendo setado automaticamente.&lt;/p&gt;

&lt;p&gt;Quando o usuário acessar então &lt;code&gt;http://localhost:8080/set_session.php&lt;/code&gt;, a função &lt;code&gt;session_start()&lt;/code&gt; irá verificar que já existe um cookie de sessão (&lt;code&gt;PHPSESSID&lt;/code&gt;) e irá carregar na superglobal &lt;code&gt;$_SESSION&lt;/code&gt; os dados correspondentes (mas lembre-se que a sessão ainda está vazia). Logo a seguir, o código adiciona no índice "usuario" da sessão o valor "maria123", e redireciona o cliente para a index, da mesma forma que no exemplo anterior.&lt;/p&gt;

&lt;p&gt;Agora, fazendo uma nova requisição para a URI &lt;code&gt;/&lt;/code&gt;, a execução de &lt;code&gt;session_start()&lt;/code&gt; em &lt;code&gt;index.php&lt;/code&gt; irá fazer o mesmo que antes – verificar que existe um cookie de sessão e carregar a superglobal &lt;code&gt;$_SESSION&lt;/code&gt; com os dados. Neste momento, entretando, o array carregado tem no índice "usuario" o valor "maria123". Com isso, a condição do &lt;code&gt;if&lt;/code&gt; será verdadeira e o código prosseguirá normalmente.&lt;/p&gt;

&lt;p&gt;A grade diferença aqui é que, enquanto no exemplo anterior o valor de "usuario" está salvo no cliente, neste exemplo este valor está salvo no servidor. Lembre-se que os dados armazenados no cliente são passíveis de leitura e modificação por parte dos usuários, o que significa que, no exemplo anterior, um usuário malicioso poderia deliberadamente trocar seu nome de usuário, mesmo tendo sido setado pelo servidor, já que este dado está salvo em um cookie. Neste segundo exemplo, o usuário apenas tem acesso a um &lt;em&gt;session ID&lt;/em&gt;, que indicará ao servidor onde, no seu lado, os dados estão salvos. Dessa forma, mesmo um usuário malicioso não é capaz de modificar o que está no servidor, podendo no máximo fazer um &lt;a href="https://owasp.org/www-community/attacks/Session_hijacking_attack" rel="noopener noreferrer"&gt;ataque de roubo de sessão&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Cookies e sessões são fundamentais para permitir que as Aplicações Web mantenham informações de estado e identificação dos usuários. Enquanto os cookies são armazenados no navegador do usuário e permitem a personalização da experiência do usuário em várias páginas, as sessões oferecem uma abordagem mais segura, armazenando os dados do usuário no servidor. A escolha entre cookies e sessões depende das necessidades específicas da aplicação e do nível de segurança desejado.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Formulários HTML e PHP</title>
      <dc:creator>Ranieri Valença</dc:creator>
      <pubDate>Wed, 26 Jul 2023 17:40:16 +0000</pubDate>
      <link>https://dev.to/ranierivalenca/formularios-html-e-php-2l29</link>
      <guid>https://dev.to/ranierivalenca/formularios-html-e-php-2l29</guid>
      <description>&lt;h2&gt;
  
  
  Tópicos
&lt;/h2&gt;

&lt;p&gt; 1. Introdução&lt;br&gt;
 2. Inputs e Interação com o Usuário&lt;br&gt;
 3. Inputs do Tipo "hidden"&lt;br&gt;
 4. Action e Métodos de Envio&lt;br&gt;
 5. Manipulação de Dados&lt;br&gt;
       5.1. Validação de Dados&lt;br&gt;
 6. Sanitização de Dados&lt;br&gt;
 7. Envio de Arquivos&lt;br&gt;
 8. Conclusão&lt;/p&gt;
&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;O HTML é uma linguagem de marcação amplamente utilizada para formatar documentos na web. Além de permitir a criação de estruturas de página e elementos visuais, o HTML também possibilita a criação de interações com os usuários por meio de âncoras (&lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt;) e formulários (&lt;code&gt;&amp;lt;form&amp;gt;&lt;/code&gt;). Os formulários são elementos essenciais que permitem aos usuários inserir dados e enviar informações para os servidores web.&lt;/p&gt;

&lt;p&gt;Diferentemente das âncoras usadas para criar links entre documentos, que geram requisições HTTP com o método GET quando clicadas, os formulários possibilitam a criação de requisições com diferentes métodos, como GET e POST. Ao submeter um formulário, o navegador envia uma requisição ao servidor contendo os dados inseridos nos campos do formulário.&lt;/p&gt;
&lt;h2&gt;
  
  
  Inputs e Interação com o Usuário
&lt;/h2&gt;

&lt;p&gt;Os inputs são elementos fundamentais nos formulários HTML e representam os campos onde os usuários podem inserir dados. Cada input possui um atributo &lt;code&gt;type&lt;/code&gt;, que define o tipo de dado que será inserido no campo. Os tipos mais comuns de input são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;text&lt;/code&gt;: Permite a inserção de texto simples.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;password&lt;/code&gt;: Semelhante ao &lt;code&gt;text&lt;/code&gt;, mas mascara os caracteres digitados, útil para senhas.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;number&lt;/code&gt;: Aceita apenas números, com opção de definir um intervalo válido.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;email&lt;/code&gt;: Projetado especificamente para inserção de endereços de e-mail válidos. Muito útil na criação de interfaces &lt;em&gt;mobile-first&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;checkbox&lt;/code&gt;: Representa uma caixa de seleção que permite ao usuário marcar uma ou várias opções.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;radio&lt;/code&gt;: Representa um botão de opção que permite ao usuário selecionar apenas uma opção de um grupo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Além desses inputs, há também os elementos &lt;code&gt;&amp;lt;select&amp;gt;&lt;/code&gt; que cria um menu suspenso (drop-down) com opções selecionáveis e &lt;code&gt;&amp;lt;textarea&amp;gt;&lt;/code&gt;que permite a inserção de texto longo em várias linhas.&lt;/p&gt;

&lt;p&gt;Para entender melhor os atributos e a utilização dos inputs, recomenda-se consultar a documentação do W3Schools sobre &lt;a href="https://www.w3schools.com/html/html_form_input_types.asp" rel="noopener noreferrer"&gt;HTML Input Types&lt;/a&gt; e o guia da MDN sobre &lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/HTML/Element/form" rel="noopener noreferrer"&gt;Formulários HTML&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Inputs do Tipo "hidden"
&lt;/h2&gt;

&lt;p&gt;Além dos inputs mencionados anteriormente, existe o tipo de input "hidden". Esse tipo de input é invisível para o usuário, não sendo exibido na interface da página. Ele é frequentemente utilizado para armazenar dados importantes que precisam ser enviados ao servidor, mas que não necessitam da interação direta do usuário.&lt;/p&gt;

&lt;p&gt;Os inputs do tipo "hidden" são particularmente úteis para o envio de informações de controle, como identificadores únicos, valores padrão ou tokens que precisam ser processados no lado do servidor. Por exemplo, ao enviar um formulário de edição de um item, pode-se incluir um input do tipo "hidden" para armazenar o ID do item que está sendo editado.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"hidden"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"id"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"123"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Action e Métodos de Envio
&lt;/h2&gt;

&lt;p&gt;Os formulários em HTML oferecem a flexibilidade de escolher o método de envio para a requisição HTTP. O método padrão é o GET, que envia os dados como parte da URI da requisição. Essa abordagem é mais adequada para formulários que não contêm dados sensíveis e não realizam ações que possam modificar informações no servidor. Por exemplo, um formulário de busca que utiliza o método GET pode enviar os parâmetros de pesquisa na URI, permitindo que o usuário compartilhe facilmente a URL com os resultados da busca.&lt;/p&gt;

&lt;p&gt;Por outro lado, o método POST envia os dados como parte do corpo da requisição, tornando-os invisíveis na URI. Isso é particularmente útil para formulários que contêm informações confidenciais ou que executam ações que podem alterar o estado do servidor, como adicionar, editar ou excluir dados. Por exemplo, um formulário de cadastro de usuário ou de envio de informações pessoais deve utilizar o método POST para proteger a privacidade dos dados do usuário.&lt;/p&gt;

&lt;p&gt;Quando um formulário é submetido, o request é feito para o endereço apontado pelo atributo &lt;code&gt;action&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="na"&gt;action=&lt;/span&gt;&lt;span class="s"&gt;"/update.php"&lt;/span&gt; &lt;span class="na"&gt;method=&lt;/span&gt;&lt;span class="s"&gt;"POST"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  ...
  &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, quando o formulário for submetido será feita uma requisição utilizando o método POST para a URI &lt;code&gt;/update.php&lt;/code&gt;. Em formulário sem o atributo &lt;code&gt;action&lt;/code&gt;, a requisição é feita para a própria URI onde o usuário está.&lt;/p&gt;

&lt;p&gt;Para saber mais sobre os métodos de envio em formulários HTML, você pode consultar a documentação do W3Schools sobre &lt;a href="https://www.w3schools.com/html/html_forms.asp" rel="noopener noreferrer"&gt;HTML Forms&lt;/a&gt; e a referência da MDN sobre &lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/HTML/Element/form" rel="noopener noreferrer"&gt;Formulários HTML&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Manipulação de Dados
&lt;/h2&gt;

&lt;p&gt;Ao enviar um formulário, os dados inseridos pelo usuário são enviados ao servidor. Cada linguagem terá sua forma de lidar com estes dados. O PHP fornece uma série de variáveis superglobais, como &lt;code&gt;$_GET&lt;/code&gt;, &lt;code&gt;$_POST&lt;/code&gt; e &lt;code&gt;$_REQUEST&lt;/code&gt;, que contêm os dados enviados pelo formulário e podem ser acessados para processamento posterior. Por exemplo, se o formulário possui um campo com o nome "idade" (&lt;code&gt;&amp;lt;input type="text" name="idade"&amp;gt;&lt;/code&gt;), é possível acessar o valor desse campo no lado do servidor através de &lt;code&gt;$_POST['idade']&lt;/code&gt; caso o método de envio seja POST, ou &lt;code&gt;$_GET['idade']&lt;/code&gt; caso o método seja GET. Note que o valor do atributo &lt;code&gt;name&lt;/code&gt; do &lt;code&gt;&amp;lt;input&amp;gt;&lt;/code&gt; é o índice na variável superglobal, e esse índice é &lt;em&gt;case sensitive&lt;/em&gt; (sensível ao caso – maiúsculas e minúsculas importam).&lt;/p&gt;

&lt;p&gt;Para entender melhor como manipular os dados de um formulário no lado do servidor com PHP, você pode consultar a documentação do W3Schools sobre &lt;a href="https://www.w3schools.com/php/php_forms.asp" rel="noopener noreferrer"&gt;PHP Form Handling&lt;/a&gt;, a referência da MDN sobre &lt;a href="https://developer.mozilla.org/en-US/docs/Learn/Forms/Sending_and_retrieving_form_data" rel="noopener noreferrer"&gt;Manipulação de Dados de Formulários HTML&lt;/a&gt; ou a referência do manual do PHP &lt;a href="https://www.php.net/manual/pt_BR/tutorial.forms.php" rel="noopener noreferrer"&gt;Tratando formulários&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Validação de Dados
&lt;/h3&gt;

&lt;p&gt;A validação de dados é uma etapa crucial no processamento de formulários. É importante garantir que os dados recebidos do usuário estejam corretos e se encaixem nos critérios esperados antes de serem usados. A validação pode incluir a verificação de campos obrigatórios, o formato correto de endereços de e-mail, números ou datas e outros critérios específicos para os dados inseridos. A validação pode (e deve) ser feita tanto no lado do cliente (assegurando uma melhor experiência para os usuários) quanto no lado do servidor, garantindo a segurança.&lt;/p&gt;

&lt;p&gt;O PHP oferece funções e recursos para facilitar a validação de dados. Os desenvolvedores podem utilizar funções como &lt;a href="https://www.php.net/manual/pt_BR/function.filter-var" rel="noopener noreferrer"&gt;&lt;code&gt;filter_var()&lt;/code&gt;&lt;/a&gt; e expressões regulares para verificar e validar os dados antes de processá-los. Por exemplo, é possível usar &lt;code&gt;filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)&lt;/code&gt; para verificar se o campo de e-mail possui um formato válido.&lt;/p&gt;

&lt;p&gt;Para aprofundar seus conhecimentos em validação de dados tanto no front-end quando com PHP, você pode consultar a documentação do W3Schools sobre &lt;a href="https://www.w3schools.com/php/php_filter.asp" rel="noopener noreferrer"&gt;PHP Filters&lt;/a&gt; e a referência da MDN sobre &lt;a href="https://developer.mozilla.org/en-US/docs/Learn/Forms/Form_validation" rel="noopener noreferrer"&gt;Client-side Form Validation&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sanitização de Dados
&lt;/h2&gt;

&lt;p&gt;Além da validação, a sanitização de dados é outra etapa importante no processamento dos dados recebidos pelo formulário. A sanitização envolve a remoção de caracteres perigosos, como tags HTML, scripts maliciosos e outras entradas indesejadas, para evitar vulnerabilidades de segurança, como ataques de injeção de código.&lt;/p&gt;

&lt;p&gt;O PHP fornece funções como &lt;a href="https://www.php.net/manual/pt_BR/function.filter-input.php" rel="noopener noreferrer"&gt;&lt;code&gt;filter_input()&lt;/code&gt;&lt;/a&gt; e &lt;a href="https://www.php.net/manual/pt_BR/function.htmlspecialchars" rel="noopener noreferrer"&gt;&lt;code&gt;htmlspecialchars()&lt;/code&gt;&lt;/a&gt; que podem ser utilizadas para sanitizar os dados recebidos do formulário antes de serem utilizados em operações críticas. A função &lt;code&gt;htmlspecialchars()&lt;/code&gt; converte caracteres especiais em entidades HTML, garantindo que eles sejam interpretados como texto e não como código executável.&lt;/p&gt;

&lt;p&gt;Para entender a importância do processo de sanitização, você pode acessar a página sobre &lt;a href="https://pt.wikipedia.org/wiki/Cross-site_scripting" rel="noopener noreferrer"&gt;XSS na Wikipedia&lt;/a&gt; ou &lt;a href="https://developer.mozilla.org/en-US/docs/Glossary/Cross-site_scripting" rel="noopener noreferrer"&gt;no MDN&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Envio de Arquivos
&lt;/h2&gt;

&lt;p&gt;Em alguns casos, os formulários precisam permitir que os usuários enviem arquivos para o servidor, como imagens, documentos ou vídeos. Para lidar com esse tipo de formulário, é necessário adicionar o atributo &lt;code&gt;enctype="multipart/form-data"&lt;/code&gt; à tag &lt;code&gt;&amp;lt;form&amp;gt;&lt;/code&gt; associada com o &lt;code&gt;method="POST"&lt;/code&gt;. Esse atributo indica ao navegador que o formulário contém arquivos binários a serem enviados, o que altera a forma como o pacote da requisição HTTP é construído.&lt;/p&gt;

&lt;p&gt;Por exemplo, considere o seguinte formulário:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="na"&gt;action=&lt;/span&gt;&lt;span class="s"&gt;"http://exemplo.com/upload"&lt;/span&gt; &lt;span class="na"&gt;method=&lt;/span&gt;&lt;span class="s"&gt;"post"&lt;/span&gt; &lt;span class="na"&gt;enctype=&lt;/span&gt;&lt;span class="s"&gt;"multipart/form-data"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"nome"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Nome:&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"nome"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"nome"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"arquivo"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Enviar Arquivo:&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"file"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"arquivo"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"arquivo"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"Enviar"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ao ser submetido com um arquivo chamado "example.txt", o pacote HTTP seria algo similar ao seguinte:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST /upload HTTP/1.1
Host: exemplo.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="nome"

John Doe
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="arquivo"; filename="example.txt"
Content-Type: text/plain

... conteúdo do arquivo example.txt ...
------WebKitFormBoundary7MA4YWxkTrZu0gW--
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Do lado do PHP, o tratamento dos arquivos enviados é feito através de variáveis superglobais especiais, como $_FILES, que contém informações sobre o arquivo, como o nome original, o tipo MIME e o local temporário onde o arquivo é armazenado. Os desenvolvedores podem mover e manipular esses arquivos usando as funções apropriadas do PHP, como &lt;a href="https://www.php.net/manual/en/function.move-uploaded-file.php" rel="noopener noreferrer"&gt;&lt;code&gt;move_uploaded_file()&lt;/code&gt;&lt;/a&gt; para salvar o arquivo em um local permanente no servidor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Ao utilizar formulários HTML em conjunto com o PHP, os desenvolvedores podem criar interações entre os usuários e as aplicações web. Os métodos de envio, a manipulação, validação e sanitização de dados, bem como o envio de arquivos, são fundamentais para o funcionamento seguro e eficiente dos formulários web. Ao entender esses conceitos e utilizar as ferramentas disponíveis no PHP, é possível criar formulários robustos e confiáveis que proporcionam uma ótima experiência aos usuários.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Servidores e Clientes Web</title>
      <dc:creator>Ranieri Valença</dc:creator>
      <pubDate>Wed, 26 Jul 2023 11:47:16 +0000</pubDate>
      <link>https://dev.to/ranierivalenca/servidores-e-clientes-web-bff</link>
      <guid>https://dev.to/ranierivalenca/servidores-e-clientes-web-bff</guid>
      <description>&lt;h2&gt;
  
  
  Tópicos
&lt;/h2&gt;

&lt;p&gt; 1. Introdução&lt;br&gt;
 2. Servidores Web&lt;br&gt;
 3. Apache e Nginx&lt;br&gt;
       3.1. Servidores Web e PHP&lt;br&gt;
       3.2. Diretório Raiz, / e Index&lt;br&gt;
             a. Diretório Raiz&lt;br&gt;
             b. / (Barra)&lt;br&gt;
             c. Index&lt;br&gt;
 4. O servidor embutido do PHP&lt;br&gt;
       4.1. Utilizando o servidor embutido&lt;br&gt;
 5. Clientes Web&lt;/p&gt;
&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;No universo do desenvolvimento de aplicações web, os termos "servidor" e "cliente" ganham uma conotação específica e essencialmente relacionada ao mundo dos softwares. Diferente da imagem tradicional de salas repletas de racks de computadores, quando se fala em servidores no contexto web, estamos nos referindo a programas de computador cuja função primordial é receber, processar e responder a requisições feitas por clientes. Enquanto isso, os clientes, igualmente, são softwares projetados para conectar-se a esses servidores, enviando requisições e processando as respostas obtidas.&lt;/p&gt;

&lt;p&gt;Nesse cenário, a arquitetura cliente-servidor surge como a base do funcionamento de aplicações web, permitindo a interação entre dispositivos conectados à internet. Enquanto os servidores, como o Apache e o Nginx, executando em computadores remotos (às vezes realmente em salas cheias de racks de computadores) atuam como os anfitriões que disponibilizam serviços e recursos, os clientes, representados por navegadores (&lt;em&gt;browsers&lt;/em&gt;), Postman, Insomnia e outros atuam como os agentes requisitantes, permitindo que os usuários interajam com páginas, APIs e outros serviços disponíveis na web.&lt;/p&gt;

&lt;p&gt;Neste artigo, exploraremos algumas características de servidores Web e de alguns dos principais servidores web, como o Apache e o Nginx, destacando suas características e usos mais comuns no desenvolvimento de aplicações web. Além disso, abordaremos o servidor embutido do PHP, que oferece uma maneira conveniente para os desenvolvedores testarem suas aplicações localmente antes da implantação em ambientes de produção.&lt;/p&gt;

&lt;p&gt;Também analisaremos a importância dos clientes web e as diversas ferramentas disponíveis, como os navegadores populares que utilizamos diariamente para navegar pela web, bem como aplicações especializadas, como o Postman e o Insomnia, que oferecem recursos específicos para desenvolvimento e teste de APIs.&lt;/p&gt;
&lt;h2&gt;
  
  
  Servidores Web
&lt;/h2&gt;

&lt;p&gt;Um conceito essencial no funcionamento dos servidores é que, na sua essência, todo servidor é um software que "escuta" em uma porta específica, seja ela TCP ou UDP. Essa "escuta" é o que permite que os servidores recebam requisições provenientes de clientes, como navegadores web ou outras aplicações.  Quando um servidor é iniciado, ele escolhe uma porta específica em que deseja "escutar". As portas mais baixas (0 a 1023) são conhecidas como "well-known ports" e são geralmente reservadas para serviços amplamente utilizados, como HTTP (porta 80), HTTPS (porta 443), FTP (porta 21), entre outros.&lt;/p&gt;

&lt;p&gt;Quando um cliente deseja se comunicar com o servidor, ele precisa conhecer o endereço IP e o número da porta em que o servidor está escutando. Com essas informações em mãos, o cliente pode estabelecer uma conexão com o servidor e através dela enviar uma requisições e aguardar pelas respostas. Os detalhes de como esta conexão acontece dizem respeito à API de socket do sistema operacional, mas não serão abordados neste artigo.&lt;/p&gt;

&lt;p&gt;Essa ideia de "escutar" em uma porta e estabelecer conexões com base nas requisições recebidas é o que permite que os servidores web, como o Apache e o Nginx, atendam a múltiplos clientes simultaneamente. Cada nova requisição recebida resulta na criação de uma nova conexão, permitindo que o servidor processe várias requisições de diferentes clientes de forma concorrente.&lt;/p&gt;
&lt;h2&gt;
  
  
  Apache e Nginx
&lt;/h2&gt;

&lt;p&gt;O Apache HTTP Server e o Nginx são dois dos servidores web mais populares e amplamente utilizados na Internet. O Apache é conhecido por sua flexibilidade e extensibilidade, permitindo que os desenvolvedores personalizem e expandam suas funcionalidades através de módulos. Ele suporta várias plataformas, incluindo Linux, Windows, macOS e outras.&lt;/p&gt;

&lt;p&gt;Por outro lado, o Nginx (pronuncia-se "engine-x") é um servidor web de alto desempenho e também atua como servidor proxy reverso e proxy HTTP. Ele ganhou destaque por sua capacidade de lidar com grandes cargas de tráfego de forma eficiente e escalável, sendo amplamente utilizado em configurações de alto volume.&lt;/p&gt;

&lt;p&gt;Ambos os servidores têm como função principal "escutar" as requisições HTTP ou HTTPS (caso o protocolo TLS esteja habilitado) recebidas de clientes, como navegadores web, e repassá-las aos softwares que de fato realizarão o processamento da requisição. Esses softwares podem ser aplicações web escritas em diversas linguagens de programação, como PHP, Python, Ruby, Node.js, entre outras. Ao receber a resposta dessas aplicações, o servidor web a envia de volta ao cliente que fez a requisição, permitindo que o conteúdo dinâmico das páginas web seja exibido ao usuário.&lt;/p&gt;

&lt;p&gt;Uma das características importantes do Apache e do Nginx é a capacidade de atuarem como proxies. Um proxy é um intermediário que recebe as requisições de clientes e as encaminha para outros servidores, na mesma máquina ou em máquinas remotas. Esse recurso é valioso para arquiteturas distribuídas, em que várias aplicações podem estar sendo executadas em diferentes servidores e o servidor web atua como um ponto de entrada único para os clientes.&lt;/p&gt;

&lt;p&gt;Além disso, os servidores web também desempenham um papel importante na implementação de recursos de segurança, como autenticação de usuário, autorização de acesso e criptografia através do protocolo HTTPS. Eles permitem que os administradores de sistemas configurem regras de segurança e protejam as aplicações contra ameaças e ataques cibernéticos.&lt;/p&gt;
&lt;h3&gt;
  
  
  Servidores Web e PHP
&lt;/h3&gt;

&lt;p&gt;No caso específico de aplicações escritas em PHP, o Apache e o Nginx se comunicam com um intermediário conhecido como "PHP-FPM" (PHP FastCGI Process Manager). O PHP-FPM é um gerenciador de processos PHP que atua como um "caller" intermediário entre o servidor web e a aplicação PHP. Quando uma requisição é recebida pelo servidor web e destina-se a uma aplicação PHP, o PHP-FPM é acionado. Internamente, o PHP-FPM realiza o equivalente a uma chamada ao script PHP em questão como se fosse feita no terminal. Esse processo permite que o PHP-FPM execute a aplicação PHP e retorne o resultado ao servidor web, que por sua vez enviará a resposta ao cliente que fez a requisição.&lt;/p&gt;

&lt;p&gt;Essa arquitetura com o PHP-FPM traz benefícios significativos para o desempenho e a escalabilidade das aplicações PHP. Como o PHP-FPM é capaz de gerenciar processos PHP separados do servidor web, ele permite um controle mais eficiente e otimizado dos recursos do servidor. Além disso, ele pode gerenciar múltiplos processos PHP simultaneamente, o que melhora o desempenho e a capacidade de resposta das aplicações em situações de alta demanda de tráfego.&lt;/p&gt;
&lt;h3&gt;
  
  
  Diretório Raiz, &lt;code&gt;/&lt;/code&gt; e Index
&lt;/h3&gt;

&lt;p&gt;Quando um servidor web recebe uma requisição HTTP de um cliente para uma determinada URI, ele precisa determinar qual arquivo ou recurso corresponde a essa URI. Em muitos casos, a URI solicitada corresponde a um diretório no sistema de arquivos do servidor web.&lt;/p&gt;
&lt;h4&gt;
  
  
  Diretório Raiz
&lt;/h4&gt;

&lt;p&gt;O diretório raiz, também conhecido como "&lt;em&gt;Document Root&lt;/em&gt;" ou "&lt;em&gt;Root Directory&lt;/em&gt;", é o ponto de partida para o servidor web ao atender uma requisição. Quando o servidor recebe uma URI, ele busca o arquivo correspondente a partir do diretório raiz.&lt;/p&gt;

&lt;p&gt;Em servidores web como o Apache e o Nginx, o diretório raiz é configurado no arquivo de configuração do servidor, como o arquivo &lt;code&gt;httpd.conf&lt;/code&gt; para o Apache. É nessa configuração que os administradores do servidor definem qual diretório no sistema de arquivos deve ser considerado como diretório raiz para atender as requisições HTTP.&lt;/p&gt;

&lt;p&gt;Por exemplo, se o diretório raiz estiver configurado como &lt;code&gt;/var/www/html&lt;/code&gt;, todas as requisições serão tratadas a partir desse diretório como ponto de partida. Se o cliente solicitar a URI &lt;code&gt;/pagina.html&lt;/code&gt;, o servidor procurará o arquivo &lt;code&gt;pagina.html&lt;/code&gt; dentro do diretório raiz (&lt;code&gt;/var/www/html/pagina.html&lt;/code&gt;) para responder à requisição.&lt;/p&gt;
&lt;h4&gt;
  
  
  &lt;code&gt;/&lt;/code&gt; (Barra)
&lt;/h4&gt;

&lt;p&gt;A barra (&lt;code&gt;/&lt;/code&gt;) é um caractere especial utilizado na URI para representar o diretório raiz. Quando um cliente solicita a URI &lt;code&gt;/&lt;/code&gt;, ele está pedindo o recurso raiz do servidor web. Nesse caso, o servidor procura pelo arquivo específico que representa a página inicial padrão do diretório raiz. Esta é a URI padrão que é requisitada quando o usuário digita apenas o domínio, como &lt;code&gt;www.exemplo.com&lt;/code&gt;. Nesse caso, o cliente fará uma requisição para o servidor deste domínio passando a URI &lt;code&gt;/&lt;/code&gt; em seu pacote HTTP.&lt;/p&gt;
&lt;h4&gt;
  
  
  Index
&lt;/h4&gt;

&lt;p&gt;O "index" é um nome de arquivo padrão utilizado pelos servidores web para identificar a página inicial de um diretório. Quando o servidor recebe uma requisição para uma URI que termina com &lt;code&gt;/&lt;/code&gt;, ou seja, representa o diretório raiz, ele procura automaticamente por um arquivo chamado &lt;code&gt;index&lt;/code&gt; dentro desse diretório.&lt;/p&gt;

&lt;p&gt;A extensão do arquivo &lt;code&gt;index&lt;/code&gt; pode variar dependendo da linguagem de programação ou tecnologia utilizada. As extensões mais comuns são &lt;code&gt;.html&lt;/code&gt; e &lt;code&gt;.php&lt;/code&gt;, mas também podem ser &lt;code&gt;.htm&lt;/code&gt;, &lt;code&gt;.xhtml&lt;/code&gt;, &lt;code&gt;.asp&lt;/code&gt;, entre outras, dependendo da configuração do servidor e do tipo de aplicação web.&lt;/p&gt;

&lt;p&gt;Por exemplo, com uma certa configuração do servidor, se um cliente solicitar a URI &lt;code&gt;/&lt;/code&gt;, o servidor procurará pelos seguintes arquivos (nessa ordem) para responder à requisição:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;index.html&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;index.php&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Outros arquivos index definidos no servidor&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Caso encontre um desses arquivos no diretório raiz, o servidor o utilizará como resposta à requisição, exibindo-o no navegador do cliente. Se nenhum desses arquivos estiver presente, o servidor retornará uma resposta com código 404 (&lt;em&gt;Not Found&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;Portanto, quando um desenvolvedor configura corretamente o servidor web e coloca um arquivo &lt;code&gt;index.[html|php|asp|...]&lt;/code&gt; no diretório raiz, o cliente poderá acessar o site apenas digitando o domínio ou endereço IP do servidor, sem a necessidade de digitar o nome do arquivo na URI. Isso é especialmente comum em sites que utilizam tecnologias de desenvolvimento web como PHP, onde o arquivo &lt;code&gt;index.php&lt;/code&gt; frequentemente funciona como a página inicial de um site ou aplicação web.&lt;/p&gt;
&lt;h2&gt;
  
  
  O servidor embutido do PHP
&lt;/h2&gt;

&lt;p&gt;O servidor embutido do PHP é uma ferramenta extremamente útil para o desenvolvimento e teste de aplicações em PHP. Ele oferece uma forma simples e rápida de iniciar um servidor web local diretamente a partir da linha de comando, sem a necessidade de configurar e executar um servidor web externo, como o Apache ou o Nginx.&lt;/p&gt;

&lt;p&gt;Internamente, o servidor embutido do PHP inicia um servidor HTTP, que escuta na porta especificada pelo desenvolvedor. Ao receber uma requisição, ele executa diretamente o arquivo solicitado, caso seja um arquivo PHP. Nesse caso, o servidor embutido interpreta o código PHP contido no arquivo e retorna o resultado para o cliente que fez a requisição.&lt;/p&gt;

&lt;p&gt;Essa abordagem simplificada torna o desenvolvimento mais ágil, pois não requer a configuração adicional do PHP-FPM nem a necessidade de ter outro servidor web em execução. É uma solução prática para desenvolvedores que desejam criar e testar aplicações PHP localmente de forma rápida e sem complicações.&lt;/p&gt;

&lt;p&gt;Entretanto, é importante ressaltar que o servidor embutido do PHP não foi projetado para uso em ambientes de produção. Ele não oferece o mesmo nível de desempenho e escalabilidade que servidores web como o Apache ou o Nginx podem proporcionar. Sua finalidade é facilitar o desenvolvimento e o teste local, permitindo que os desenvolvedores executem suas aplicações rapidamente sem a necessidade de configurações complexas.&lt;/p&gt;

&lt;p&gt;Uma característica interessante do servidor embutido é a utilização de um script de "roteamento" (também conhecido como Front Controller). Todas as requisições que chegam são enviadas para este único script, que é responsável por fazer o processamento e enviar a resposta para o cliente. Isso permite que a aplicação utilize URLs amigáveis, que são URLs mais legíveis e significativas para os usuários, sem a presença de extensões de arquivos ou parâmetros complexos.&lt;/p&gt;

&lt;p&gt;Com a utilização do Front Controller, o servidor embutido pode direcionar cada requisição para a parte apropriada da aplicação, facilitando a organização e a estrutura do código. Essa abordagem também permite a implementação de rotas personalizadas e o uso de frameworks PHP populares, como o Laravel, o Symfony e o CodeIgniter.&lt;/p&gt;

&lt;p&gt;Para utilizar o servidor embutido do PHP, tendo o PHP instalado e disponível no PATH do terminal de comando, é preciso navegar até um diretório, que será considerado o diretório raiz, e digitar o seguinte comando: &lt;/p&gt;
&lt;h3&gt;
  
  
  Utilizando o servidor embutido
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php &lt;span class="nt"&gt;-S&lt;/span&gt; localhost:8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Neste exemplo, estamos informando ao servidor embutido que ele deve escutar requisições vindas de &lt;code&gt;localhost&lt;/code&gt; (ou seja, do próprio computador) na porta &lt;code&gt;8000&lt;/code&gt;. A porta pode ser escolhida conforme o gosto do usuário, e também é possível trocar o &lt;code&gt;localhost&lt;/code&gt; por &lt;code&gt;0.0.0.0&lt;/code&gt;, fazendo com o que o servidor escute requisições vindas de qualquer cliente conectado na mesma rede que o computador (embora possivelmente seja necessário fazer configurações no firewall para permitir esse tipo de uso).&lt;/p&gt;

&lt;p&gt;Sem o PHP instalado também é possível fazê-lo utilizando Docker. Falaremos mais sobre esta plataforma em outros artigos, mas a ideia é utilizar um container com uma imagem do PHP, fazê-lo iniciar o servidor embutido do PHP em um dado diretório e montar o diretório local neste diretório do container:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;:/app &lt;span class="nt"&gt;-w&lt;/span&gt; /app &lt;span class="nt"&gt;-p&lt;/span&gt; 8080:8080 php:8.2 php &lt;span class="nt"&gt;-S&lt;/span&gt; 0.0.0.0:8080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ou&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; %cd%:/app &lt;span class="nt"&gt;-w&lt;/span&gt; /app &lt;span class="nt"&gt;-p&lt;/span&gt; 8080:8080 php:8.2 php &lt;span class="nt"&gt;-S&lt;/span&gt; 0.0.0.0:8080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;usando o terminal nativo do Windows.&lt;/p&gt;




&lt;h2&gt;
  
  
  Clientes Web
&lt;/h2&gt;

&lt;p&gt;Clientes web desempenham um papel crucial no ecossistema da internet e são fundamentais para a comunicação entre os usuários e os servidores web que hospedam as aplicações. Embora os navegadores (browsers) sejam os clientes web mais conhecidos e amplamente utilizados, é importante destacar que a categoria de clientes web abrange uma ampla gama de aplicações que se conectam a servidores por meio do protocolo HTTP ou HTTPS.&lt;/p&gt;

&lt;p&gt;Os navegadores modernos, como Google Chrome, Mozilla Firefox, Microsoft Edge e Safari, são verdadeiras plataformas de software sofisticadas, comportando-se quase como sistemas operacionais. Eles incorporam diversos módulos e funcionalidades que trabalham em conjunto. Esses módulos incluem acesso à rede para estabelecer conexões com servidores web, mecanismos de parsing para interpretar e processar os códigos HTML e CSS, renderização para exibir as páginas web, tratamento de eventos para lidar com ações do usuário, motor de JavaScript para executar código do lado do cliente e muito mais.&lt;/p&gt;

&lt;p&gt;Os navegadores são capazes de enviar diferentes tipos de requisições HTTP aos servidores, como GET, POST, PUT, DELETE, entre outras utilizando apenas suas APIs nativas. Essas requisições podem conter cabeçalhos personalizados, cookies e outras informações relevantes para a comunicação com os servidores. Além disso, os navegadores têm a capacidade de lidar com diversos formatos de resposta enviados pelos servidores, como documentos HTML, XML, JSON e também arquivos binários, como imagens e vídeos.&lt;/p&gt;

&lt;p&gt;No entanto, além dos navegadores, existem outras aplicações que também funcionam como clientes web. As aplicações mobile, por exemplo, são projetadas para dispositivos móveis, como smartphones e tablets, e têm a capacidade de criar suas próprias requisições HTTP com cabeçalhos personalizados e enviar dados binários para os servidores com os quais se conectam. Isso abre um leque gigantesco de possibilidades para desenvolver aplicativos móveis que interagem com serviços e recursos disponíveis na web.&lt;/p&gt;

&lt;p&gt;Além disso, com o advento da Internet das Coisas (IoT), dispositivos inteligentes, como smartwatches, termostatos inteligentes, câmeras e outros gadgets conectados à internet, também podem atuar como clientes web, enviando e recebendo dados de servidores remotos para oferecer uma experiência conectada aos usuários.&lt;/p&gt;

&lt;p&gt;Outras ferramentas essenciais no universo do desenvolvimento de aplicações web são o Postman, o Insomnia, o Thunder Client (extensão do VSCode) e outros similares. Esses clientes web são projetados especificamente para desenvolvedores, permitindo que eles criem e testem requisições HTTP de forma rápida e eficiente. Essas ferramentas possuem interfaces que permitem aos desenvolvedores configurar várias opções, como parâmetros, cabeçalhos personalizados, autenticação e muito mais. Com esses clientes, os desenvolvedores podem realizar testes de integração, testes de API e verificar as respostas dos servidores para garantir que suas aplicações estejam funcionando corretamente.&lt;/p&gt;




&lt;p&gt;Com este artigo eu espero que fique mais claro que são servidores e clientes web, quais seus papeis e como utilizar o servidor embutido do PHP para começar a desenvolver Aplicações Web.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>A arquitetura Cliente-Servidor e o protocolo HTTP</title>
      <dc:creator>Ranieri Valença</dc:creator>
      <pubDate>Tue, 25 Jul 2023 19:04:41 +0000</pubDate>
      <link>https://dev.to/ranierivalenca/a-arquitetura-cliente-servidor-e-o-protocolo-http-21nd</link>
      <guid>https://dev.to/ranierivalenca/a-arquitetura-cliente-servidor-e-o-protocolo-http-21nd</guid>
      <description>&lt;h2&gt;
  
  
  Tópicos
&lt;/h2&gt;

&lt;p&gt; 1. Tópicos&lt;br&gt;
 2. Protocolo HTTP&lt;br&gt;
       2.1. Stateless&lt;br&gt;
       2.2. Estrutura&lt;br&gt;
       2.3. Requisições HTTP&lt;br&gt;
             a. GET&lt;br&gt;
             b. POST&lt;br&gt;
             c. PUT&lt;br&gt;
             d. DELETE&lt;br&gt;
       2.4. Respostas HTTP&lt;br&gt;
             a. JSON&lt;br&gt;
             b. XML&lt;br&gt;
             c. HTML&lt;br&gt;
       2.5. Arquivos&lt;br&gt;
 3. MIME-Type em Responses&lt;br&gt;
 4. URI vs. URL&lt;br&gt;
 5. Bônus - o cliente Curl: Uma Ferramenta Versátil para Requisições HTTP&lt;br&gt;
       5.1. Exemplos de Uso do Curl:&lt;br&gt;
 6. Conclusão&lt;/p&gt;
&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Partindo do princípio que o leitor tem noções gerais de rede de computadores e conhecimento sobre a comunicação entre dispositivos através das redes e sabe o que é um protocolo de comunicação, este artigo trata sobre a arquitetura cliente-servidor e o protocolo HTTP.&lt;/p&gt;

&lt;p&gt;A arquitetura cliente-servidor é um modelo de comunicação muito utilizado em sistemas distribuídos e aplicações web. Nesse modelo, o sistema é dividido em duas partes principais: o cliente e o servidor. O cliente é responsável por fazer solicitações ao servidor e processar as respostas recebidas. Já o servidor é responsável por receber as solicitações do cliente, processá-las e enviar as respostas de volta ao cliente.&lt;/p&gt;

&lt;p&gt;A comunicação entre o cliente e o servidor na Web é geralmente realizada através do protocolo HTTP (Hypertext Transfer Protocol), que é amplamente utilizado na internet para a transferência de dados entre clientes e servidores.&lt;/p&gt;
&lt;h2&gt;
  
  
  Protocolo HTTP
&lt;/h2&gt;

&lt;p&gt;O protocolo HTTP é baseado no modelo requisição-resposta, onde o cliente envia uma requisição ao servidor e o servidor responde com os dados solicitados ou um código de status indicando o resultado da operação.&lt;/p&gt;

&lt;p&gt;É um protocolo baseado em texto (apesar de poder transportar dados binários) e utiliza o TCP (Transmission Control Protocol) como protocolo de transporte. O TCP é um dos principais protocolos da camada de transporte do modelo TCP/IP e é responsável por garantir uma comunicação confiável entre os dispositivos.&lt;/p&gt;

&lt;p&gt;Ao utilizar o TCP como protocolo de transporte, o HTTP pode contar com mecanismos como confirmações de recebimento (ACKs), retransmissão de pacotes perdidos e controle de fluxo para garantir que os dados sejam entregues de forma confiável e em ordem.&lt;/p&gt;

&lt;p&gt;O uso do TCP torna o HTTP uma escolha robusta para a transferência de dados na internet, especialmente para aplicações que exigem alta confiabilidade e precisão na entrega de informações.&lt;/p&gt;
&lt;h3&gt;
  
  
  Stateless
&lt;/h3&gt;

&lt;p&gt;O protocolo HTTP (Hypertext Transfer Protocol) é considerado stateless, o que significa que cada requisição enviada pelo cliente ao servidor é tratada de forma independente e não contém informações sobre ações anteriores. Em outras palavras, o servidor não mantém informações sobre o estado da sessão ou interação com o cliente entre as requisições.&lt;/p&gt;

&lt;p&gt;Algumas informações importantes sobre protocolos stateless:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cada requisição é tratada de forma independente.&lt;/li&gt;
&lt;li&gt;Não há armazenamento de informações de estado entre requisições.&lt;/li&gt;
&lt;li&gt;O servidor não mantém informações sobre as ações anteriores do cliente.&lt;/li&gt;
&lt;li&gt;A comunicação é mais simples e leve, pois não há necessidade de manter uma conexão contínua entre o cliente e o servidor.&lt;/li&gt;
&lt;li&gt;É mais escalável, pois cada requisição pode ser processada de forma isolada e distribuída entre diferentes servidores.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Essa natureza stateless do HTTP tem implicações importantes para o desenvolvimento de aplicações web. Como o servidor não mantém informações sobre o estado da sessão, todas as informações relevantes devem ser incluídas na própria requisição, geralmente através de cabeçalhos ou parâmetros na URL. Isso permite que o servidor trate cada solicitação de forma independente, tornando a comunicação mais simples e previsível.&lt;/p&gt;

&lt;p&gt;Por outro lado, aplicações que exigem uma comunicação mais complexa e interativa, como sistemas de autenticação ou carrinhos de compras em e-commerce, podem enfrentar desafios adicionais ao trabalhar com o HTTP stateless. Nesses casos, podem ser necessárias técnicas adicionais, como o uso de cookies ou tokens, para manter informações de estado entre as requisições. Falaremos sobre isso em outros artigos futuros.&lt;/p&gt;
&lt;h3&gt;
  
  
  Estrutura
&lt;/h3&gt;

&lt;p&gt;Uma requisição HTTP consiste em uma série de linhas de texto, separadas por &lt;code&gt;\n&lt;/code&gt;, que delimita uma linha. A requisição tem uma linha inicial contendo o método da requisição, o caminho do recurso desejado e a versão do protocolo, seguida por cabeçalhos opcionais e o corpo da requisição (opcional em algumas situações).&lt;/p&gt;

&lt;p&gt;Exemplo de uma requisição HTTP:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /pagina.html HTTP/1.1
Host: www.exemplo.com
User-Agent: Mozilla/5.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uma resposta HTTP também consiste em uma linha inicial contendo a versão do protocolo, o código de status e uma frase descritiva, seguida por cabeçalhos opcionais e o corpo da resposta (opcional em algumas situações).&lt;/p&gt;

&lt;p&gt;Exemplo de uma resposta HTTP:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1234

&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;title&amp;gt;Página de Exemplo&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
...
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Os cabeçalhos do protocolo HTTP são bastante numerosos, além de poderem ser definidos pela aplicação (ou seja, uma aplicação pode adicionar cabeçalhos não-padrões), tanto na requisição quanto na resposta. Para mais informações sobre os cabeçalhos http, vale dar uma olhada na &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers" rel="noopener noreferrer"&gt;página de cabeçalhos do HTTP do MDN Web Docs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A seguir, vamos detalhar um pouco mais a requisição (&lt;em&gt;request&lt;/em&gt;) e a resposta (&lt;em&gt;response&lt;/em&gt;) de mensagens deste protocolo.&lt;/p&gt;




&lt;h3&gt;
  
  
  Requisições HTTP
&lt;/h3&gt;

&lt;p&gt;As requisições HTTP são a base da interação entre cliente e servidor na arquitetura cliente-servidor. Cada requisição é composta por um método, um caminho (URI – falaremos mais adiante sobre URI e URL) e uma versão do protocolo – esta é a primeira linha da requisição. Além disso, as requisições podem incluir cabeçalhos e um corpo com dados adicionais.&lt;/p&gt;

&lt;p&gt;A definição do protocolo HTTP em sua versão mais usada atualmente (1.1) é feita na &lt;a href="https://www.rfc-editor.org/rfc/rfc2616" rel="noopener noreferrer"&gt;RFC 2616&lt;/a&gt; (um documento que vale muito a leitura) e define os seguintes métodos para o HTTP:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OPTIONS&lt;/li&gt;
&lt;li&gt;GET&lt;/li&gt;
&lt;li&gt;HEAD&lt;/li&gt;
&lt;li&gt;POST&lt;/li&gt;
&lt;li&gt;PUT&lt;/li&gt;
&lt;li&gt;DELETE&lt;/li&gt;
&lt;li&gt;TRACE&lt;/li&gt;
&lt;li&gt;CONNECT&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Apesar disso, alguns métodos são mais utilizados e serão explicados melhor a seguir.&lt;/p&gt;

&lt;h4&gt;
  
  
  GET
&lt;/h4&gt;

&lt;p&gt;O método GET é usado para solicitar a recuperação de um recurso específico no servidor. Ele envia os parâmetros na URL, geralmente na forma de cadeias de consulta (query strings). Este é o método mais utilizado na Web, pois é com ele que os &lt;em&gt;browsers&lt;/em&gt; fazem a requisição para os servidores.&lt;/p&gt;

&lt;p&gt;Exemplo de requisição GET:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /pagina.html?parametro1=valor1&amp;amp;parametro2=valor2 HTTP/1.1
Host: www.exemplo.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, apenas um cabeçalho extra está sendo enviado (&lt;code&gt;Host: www.exemplo.com&lt;/code&gt;), a URI é &lt;code&gt;/pagina.html&lt;/code&gt; e os parâmetros, enviados após o sinal de interrogação (&lt;code&gt;?&lt;/code&gt;) são &lt;code&gt;parametro1=valor1&lt;/code&gt; e &lt;code&gt;parametro2=valor2&lt;/code&gt;. Note também que, por ser uma requisição que utiliza o método &lt;code&gt;GET&lt;/code&gt;, não há uma linha em branco após os cabeçalhos, já que este método não suporta um corpo adicional.&lt;/p&gt;

&lt;h4&gt;
  
  
  POST
&lt;/h4&gt;

&lt;p&gt;O método POST é usado para enviar dados ao servidor, geralmente para criar um novo recurso ou enviar informações sensíveis, como senhas ou dados de formulários.&lt;/p&gt;

&lt;p&gt;Exemplo de requisição POST:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST /criar_usuario HTTP/1.1
Host: www.exemplo.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 27

nome=João&amp;amp;email=joao@example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, alguns cabeçalhos extras estão sendo incluídos (&lt;code&gt;Host: www.exemplo.com&lt;/code&gt;, &lt;code&gt;Content-Type: application/x-www-form-urlencoded&lt;/code&gt; e &lt;code&gt;Content-Length: 27&lt;/code&gt;). Note que após os cabeçalhos há uma linha em branco (ou seja, duas quebras de linha seguidas – &lt;code&gt;\n\n&lt;/code&gt;). Esta linha indica ao servidor que receberá esta requisição que o cabeçalho do protocolo está terminado, e que todo dado que ainda for enviado fará parte do corpo. O cabeçalho &lt;code&gt;Content-Length&lt;/code&gt; indica quantos bytes o servidor deve esperar no corpo.&lt;/p&gt;

&lt;h4&gt;
  
  
  PUT
&lt;/h4&gt;

&lt;p&gt;O método PUT é usado para enviar dados ao servidor para criar ou atualizar um recurso específico.&lt;/p&gt;

&lt;p&gt;Exemplo de requisição PUT:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PUT /atualizar_usuario/123 HTTP/1.1
Host: www.exemplo.com
Content-Type: application/json
Content-Length: 47

{"nome": "Maria", "email": "maria@example.com"}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, o tipo cabeçalho &lt;code&gt;Content-Type&lt;/code&gt; avisa ao servidor que os dados enviados estão no formato &lt;code&gt;application/json&lt;/code&gt;, e por conta disso é possível notar que o corpo da requisição contém dados em JSON (formato que será mais explorado adiante).&lt;/p&gt;

&lt;h4&gt;
  
  
  DELETE
&lt;/h4&gt;

&lt;p&gt;O método DELETE é usado para solicitar a exclusão de um recurso específico no servidor.&lt;/p&gt;

&lt;p&gt;Exemplo de requisição DELETE:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DELETE /excluir_usuario/456 HTTP/1.1
Host: www.exemplo.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Respostas HTTP
&lt;/h3&gt;

&lt;p&gt;As respostas HTTP são enviadas pelo servidor como resposta às requisições feitas pelo cliente. Cada resposta é composta por uma linha inicial contendo o código de status e a versão do protocolo, seguida pelos cabeçalhos e o corpo com os dados solicitados (se aplicável).&lt;/p&gt;

&lt;p&gt;Os códigos de status são usados para indicar o resultado da requisição. Eles são divididos em classes numéricas que indicam o tipo de resposta. Alguns dos códigos de status mais comuns são:&lt;/p&gt;

&lt;p&gt;2xx: Indica que a requisição foi bem sucedida, como por exemplo "OK" (200) ou "Created" (201).&lt;br&gt;
3xx: Indica redirecionamento, como por exemplo "Found" (302).&lt;br&gt;
4xx: Indica erros do cliente, como por exemplo "Not Found" (404) ou "Unauthorized" (401).&lt;br&gt;
5xx: Indica erros no servidor, como por exemplo "Internal Server Error" (500).&lt;/p&gt;

&lt;p&gt;O conteúdo das respostas podem ser de diversos tipos. A seguir, vamos falar um pouco sobre os mais comuns em aplicações web mais simples.&lt;/p&gt;
&lt;h4&gt;
  
  
  JSON
&lt;/h4&gt;

&lt;p&gt;O JSON (JavaScript Object Notation) é um formato leve e amplamente utilizado para troca de dados entre cliente e servidor. Ele é fácil de ler e escrever para humanos e fácil de analisar e gerar para máquinas. Sua especificação pode ser acessada &lt;a href="https://www.json.org/json-en.html" rel="noopener noreferrer"&gt;no site oficial, json.org&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Exemplo de resposta com JSON:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 56

{"nome": "João", "idade": 30, "email": "joao@example.com"}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note que na resposta, após a linha inicial da resposta, existem alguns cabeçalhos (&lt;code&gt;Content-Type: application/json&lt;/code&gt; e &lt;code&gt;Content-Length: 56&lt;/code&gt;), e logo após uma linha em branco. Assim como na requisição, esta linha em branco indica ao cliente que está recebendo a resposta que acabaram os cabeçalhos, e que o que vem a seguir é o conteúdo (corpo) da resposta.&lt;/p&gt;

&lt;h4&gt;
  
  
  XML
&lt;/h4&gt;

&lt;p&gt;O XML (eXtensible Markup Language) é outra opção para troca de dados entre cliente e servidor. Ele é mais verboso que o JSON, mas também é amplamente suportado e estruturado.&lt;/p&gt;

&lt;p&gt;Exemplo de resposta com XML:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HTTP/1.1 200 OK
Content-Type: application/xml
Content-Length: 143

&amp;lt;usuario&amp;gt;
    &amp;lt;nome&amp;gt;João&amp;lt;/nome&amp;gt;
    &amp;lt;idade&amp;gt;30&amp;lt;/idade&amp;gt;
    &amp;lt;email&amp;gt;joao@example.com&amp;lt;/email&amp;gt;
&amp;lt;/usuario&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  HTML
&lt;/h4&gt;

&lt;p&gt;O HTML é usado para definir a estrutura e o layout de páginas web. As respostas HTML são renderizadas pelos navegadores para exibir conteúdo aos usuários.&lt;/p&gt;

&lt;p&gt;Exemplo de resposta com HTML:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1234

&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;Página de Exemplo&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;h1&amp;gt;Olá, mundo!&amp;lt;/h1&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Arquivos
&lt;/h3&gt;

&lt;p&gt;As respostas também podem conter arquivos binários, como imagens, vídeos, documentos, etc. Nesses casos, o servidor define o cabeçalho &lt;code&gt;Content-Type&lt;/code&gt; apropriado para indicar o tipo de arquivo.&lt;/p&gt;

&lt;p&gt;Exemplo de resposta com arquivo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HTTP/1.1 200 OK
Content-Type: image/jpeg
Content-Length: 45678

&amp;lt;dados binários do arquivo&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, o &lt;code&gt;Content-Type&lt;/code&gt; do cabeçalho está informando ao cliente que o corpo da resposta tem os dados binários de uma imagem no formato JPG. Considerando a importância de conhecer este cabeçalho, vamos falar um pouco mais sobre ele.&lt;/p&gt;




&lt;h2&gt;
  
  
  MIME-Type em Responses
&lt;/h2&gt;

&lt;p&gt;O MIME-Type (Multipurpose Internet Mail Extensions) é um tipo de dado que indica o formato e o tipo de conteúdo presente em uma resposta HTTP. Ele é especificado através do cabeçalho &lt;code&gt;Content-Type&lt;/code&gt;. O MIME-Type é essencial para que o cliente saiba como interpretar e processar o conteúdo da resposta corretamente.&lt;/p&gt;

&lt;p&gt;Por exemplo, o &lt;code&gt;Content-Type&lt;/code&gt; pode ser definido como &lt;code&gt;application/json&lt;/code&gt; para indicar que a resposta contém dados no formato JSON, ou como &lt;code&gt;text/html&lt;/code&gt; para indicar que a resposta é uma página HTML, ou &lt;code&gt;text/css&lt;/code&gt; para indicar que a resposta trata-se de um arquivo de folha de estilos CSS.&lt;/p&gt;

&lt;p&gt;Você pode encontrar mais informações sobre os diferentes tipos de MIME-Type no &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types" rel="noopener noreferrer"&gt;MDN Web Docs&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  URI vs. URL
&lt;/h2&gt;

&lt;p&gt;URI (Uniform Resource Identifier) e URL (Uniform Resource Locator) são conceitos relacionados, mas não idênticos.&lt;/p&gt;

&lt;p&gt;Uma URI é uma sequência compacta de caracteres que identifica um recurso abstrato ou físico, que pode ser um documento, imagem, serviço, etc. A URI é uma terminologia genérica que inclui URLs e URNs (Uniform Resource Names).&lt;/p&gt;

&lt;p&gt;Uma URL é um tipo específico de URI que fornece os meios para localizar um recurso através de sua representação como uma sequência de caracteres. A URL inclui o esquema (como HTTP ou FTP), o domínio ou endereço IP, a porta, o caminho e os parâmetros.&lt;/p&gt;

&lt;p&gt;Em resumo, toda URL é uma URI, mas nem toda URI é uma URL. Por exemplo, a URI urn:isbn:0451450523 identifica unicamente um livro pelo seu número ISBN, mas não é uma URL, pois não indica como acessar o recurso.&lt;/p&gt;

&lt;p&gt;Para mais informações sobre URI e URL, você pode consultar &lt;a href="https://en.wikipedia.org/wiki/Uniform_Resource_Identifier" rel="noopener noreferrer"&gt;o artigo da Wikipedia&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bônus - o cliente Curl: Uma Ferramenta Versátil para Requisições HTTP
&lt;/h2&gt;

&lt;p&gt;O curl é uma ferramenta de linha de comando amplamente utilizada para fazer requisições HTTP e interagir com diversos tipos de serviços na web. Com ele, é possível realizar operações como enviar dados para APIs, realizar testes de conectividade e até mesmo baixar arquivos. A versatilidade e simplicidade do curl o tornam uma escolha popular entre desenvolvedores e administradores de sistemas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplos de Uso do Curl:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Requisição GET para uma API de Teste: JSONPlaceholder&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A JSONPlaceholder é uma API de teste que fornece dados fictícios em formato JSON para fins de desenvolvimento e teste. Vamos usar o curl para fazer uma requisição GET para a rota "/users/1" e obter os dados do usuário com id &lt;code&gt;1&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://jsonplaceholder.typicode.com/users/1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Podemos também adicionar o argumento &lt;code&gt;-v&lt;/code&gt; para que o Curl exiba também os cabeçalhos, tanto do request quanto do response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-v&lt;/span&gt; https://jsonplaceholder.typicode.com/users/1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesse caso, a resposta será algo como&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; GET /users/1 HTTP/2
&amp;gt; Host: jsonplaceholder.typicode.com
&amp;gt; user-agent: curl/7.88.1
&amp;gt; accept: */*
&amp;gt; 
&amp;lt; HTTP/2 200 
&amp;lt; date: Tue, 25 Jul 2023 18:29:21 GMT
&amp;lt; content-type: application/json; charset=utf-8
&amp;lt; content-length: 509
&amp;lt; x-powered-by: Express
&amp;lt; x-ratelimit-limit: 1000
&amp;lt; x-ratelimit-remaining: 998
&amp;lt; x-ratelimit-reset: 1689692921
&amp;lt; vary: Origin, Accept-Encoding
&amp;lt; access-control-allow-credentials: true
&amp;lt; cache-control: max-age=43200
&amp;lt; pragma: no-cache
&amp;lt; expires: -1
&amp;lt; x-content-type-options: nosniff
&amp;lt; etag: W/"1fd-+fao8fhs8ofnuo93no"
&amp;lt; via: 1.1 vegur
&amp;lt; cf-cache-status: HIT
&amp;lt; age: 160
&amp;lt; accept-ranges: bytes
&amp;lt; nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
&amp;lt; server: cloudflare
&amp;lt; alt-svc: h3=":443"; ma=86400
&amp;lt; 
{
  "id": 1,
  "name": "Leanne Graham",
  "username": "Bret",
  "email": "Sincere@april.biz",
  "address": {
    "street": "Kulas Light",
    "suite": "Apt. 556",
    "city": "Gwenborough",
    "zipcode": "92998-3874",
    "geo": {
      "lat": "-37.3159",
      "lng": "81.1496"
    }
  },
  "phone": "1-770-736-8031 x56442",
  "website": "hildegard.org",
  "company": {
    "name": "Romaguera-Crona",
    "catchPhrase": "Multi-layered client-server neural-net",
    "bs": "harness real-time e-markets"
  }
* Connection #0 to host jsonplaceholder.typicode.com left intact
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note que as primeiras linhas começam com o caracter &lt;code&gt;&amp;gt;&lt;/code&gt;, indicando que esta é uma linha da requisição; após uma linha em branco (&lt;code&gt;&amp;gt;&lt;/code&gt; apenas), seguem uma sucessão de linhas começadas por &lt;code&gt;&amp;lt;&lt;/code&gt;, indicando os cabeçalhos da resposta. Após uma linha em branco da resposta, indicada por um &lt;code&gt;&amp;lt;&lt;/code&gt; vazio, começam os dados da resposta. Note a grande quantidade de cabeçalhos que é trocado em cada request/response ;)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Requisição POST para Enviar Dados para uma API: ReqRes.in&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O ReqRes.in é outra API de teste que permite fazer requisições HTTP simuladas. Vamos usar o curl para fazer uma requisição POST e enviar dados JSON para a rota "/users" com o objetivo de criar um novo usuário.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"name": "John Doe", "job": "Developer"}'&lt;/span&gt; https://reqres.in/api/users
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Este artigo fornece uma introdução à arquitetura cliente-servidor e ao protocolo HTTP, que são conhecimentos importantes para aqueles que desejam trabalhar com o desenvolvimento de Aplicações para Web.&lt;/p&gt;

&lt;p&gt;É importante ressaltar, entretanto, que não abordamos aqui algumas questões importantes relacionadas à segurança e métodos de autenticação, mas que serão abordados eventualmente em outros artigos.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>PHP: mais alguns conceitos importantes da linguagem</title>
      <dc:creator>Ranieri Valença</dc:creator>
      <pubDate>Tue, 25 Jul 2023 15:16:44 +0000</pubDate>
      <link>https://dev.to/ranierivalenca/php-mais-alguns-conceitos-importantes-da-linguagem-40e2</link>
      <guid>https://dev.to/ranierivalenca/php-mais-alguns-conceitos-importantes-da-linguagem-40e2</guid>
      <description>&lt;h2&gt;
  
  
  Tópicos
&lt;/h2&gt;

&lt;p&gt; 1. Introdução&lt;br&gt;
 2. Funções em PHP&lt;br&gt;
       2.1. Funções&lt;br&gt;
       2.2. Funções Anônimas&lt;br&gt;
       2.3. Arrow Functions (Funções Flecha)&lt;br&gt;
 3. Manipulação de Arquivos em PHP&lt;br&gt;
       3.1. Leitura de Arquivos&lt;br&gt;
       3.2. Escrita em Arquivos&lt;br&gt;
       3.3. Manipulador de Arquivo e Ponteiro de Arquivo&lt;br&gt;
             a. Modos de Abertura de Arquivo&lt;br&gt;
       3.4. Função fclose() e fechamento de arquivos&lt;br&gt;
       3.5. Função file()&lt;br&gt;
       3.6. Função unlink()&lt;br&gt;
 4. Manipulação de Arquivos CSV em PHP&lt;br&gt;
       4.1. Função fgetcsv()&lt;br&gt;
       4.2. Função str_getcsv&lt;br&gt;
       4.3. Função fputcsv()&lt;br&gt;
 5. Manipulação de Strings em PHP&lt;br&gt;
 6. Includes e Requires&lt;br&gt;
 7. Manipulação de Datas em PHP&lt;/p&gt;
&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Neste artigo vamos explorar mais alguns conceitos e funções importantes do PHP que são amplamente utilizados quando construímos Aplicações Web com esta linguagem.&lt;/p&gt;


&lt;h2&gt;
  
  
  Funções em PHP
&lt;/h2&gt;

&lt;p&gt;Em PHP, as funções são blocos de código reutilizáveis que podem ser chamados em diferentes partes do código para executar uma tarefa específica. Elas ajudam a organizar e modularizar o código, tornando-o mais legível e fácil de manter.&lt;/p&gt;
&lt;h3&gt;
  
  
  Funções
&lt;/h3&gt;

&lt;p&gt;Em PHP podemos criar funções comuns com nomes específicos. Essas funções podem receber parâmetros e retornar valores, permitindo uma maior modularização e organização do código.&lt;/p&gt;

&lt;p&gt;Exemplo de criação e chamada de função comum:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Função que retorna a soma de dois números&lt;/span&gt;
&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;somar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nv"&gt;$b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Chamada da função e atribuição do resultado a uma variável&lt;/span&gt;
&lt;span class="nv"&gt;$resultado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;somar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$resultado&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Saída: 8&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Funções Anônimas
&lt;/h3&gt;

&lt;p&gt;Uma função anônima é uma função que não possui um nome associado a ela. Elas são úteis quando você precisa de uma função temporária ou como argumento para outras funções, como em callbacks. Em PHP, as funções anônimas são criadas usando a palavra-chave &lt;code&gt;function&lt;/code&gt; sem um nome seguido de parênteses e chaves para delimitar o bloco de código.&lt;/p&gt;

&lt;p&gt;Exemplo de função anônima:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$add&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nv"&gt;$b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nv"&gt;$result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Chama a função anônima e atribui o resultado a $result&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Saída: 8&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Arrow Functions (Funções Flecha)
&lt;/h3&gt;

&lt;p&gt;As arrow functions foram introduzidas no PHP 7.4 e são uma forma mais concisa de definir funções anônimas com apenas uma expressão. Elas permitem que você escreva funções de forma mais sucinta usando uma sintaxe reduzida.&lt;/p&gt;

&lt;p&gt;Exemplo de arrow function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$add&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nv"&gt;$b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nv"&gt;$result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Saída: 8&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Manipulação de Arquivos em PHP
&lt;/h2&gt;

&lt;p&gt;PHP oferece diversas funções para a manipulação de arquivos, permitindo que você leia e escreva em arquivos, verifique informações de arquivos e diretórios, crie e exclua arquivos e diretórios, entre outras operações.&lt;/p&gt;

&lt;h3&gt;
  
  
  Leitura de Arquivos
&lt;/h3&gt;

&lt;p&gt;Para ler o conteúdo de um arquivo em PHP, você pode utilizar a função &lt;code&gt;file_get_contents()&lt;/code&gt; ou &lt;code&gt;fopen()&lt;/code&gt; combinada com &lt;code&gt;fread()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Exemplo de leitura de arquivo com &lt;code&gt;file_get_contents()&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$conteudo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;file_get_contents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'arquivo.txt'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$conteudo&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esta função abre o arquivo, lê seu conteúdo, fecha o arquivo e retorna o seu conteúdo.&lt;/p&gt;

&lt;p&gt;Exemplo de leitura de arquivo com &lt;code&gt;fopen()&lt;/code&gt; e &lt;code&gt;fread()&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$handle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;fopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'arquivo.txt'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'r'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$conteudo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;fread&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$handle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;filesize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'arquivo.txt'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="nb"&gt;fclose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$handle&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$conteudo&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Escrita em Arquivos
&lt;/h3&gt;

&lt;p&gt;Para escrever em um arquivo em PHP, você pode usar a função &lt;code&gt;file_put_contents()&lt;/code&gt; ou &lt;code&gt;fopen()&lt;/code&gt; combinada com &lt;code&gt;fwrite()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Exemplo de escrita em arquivo com &lt;code&gt;file_put_contents()&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$conteudo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Este é um texto para escrever no arquivo.'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nb"&gt;file_put_contents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'arquivo.txt'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$conteudo&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A função &lt;code&gt;file_put_contents()&lt;/code&gt; &lt;strong&gt;apaga o conteúdo do arquivo&lt;/strong&gt; e o substitui pelo conteúdo que está sendo passado como argumento.&lt;/p&gt;

&lt;p&gt;Exemplo de escrita em arquivo com &lt;code&gt;fopen()&lt;/code&gt; e &lt;code&gt;fwrite()&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$handle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;fopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'arquivo.txt'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'w'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$conteudo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Este é um texto para escrever no arquivo.'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nb"&gt;fwrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$handle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$conteudo&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nb"&gt;fclose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$handle&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Manipulador de Arquivo e Ponteiro de Arquivo
&lt;/h3&gt;

&lt;p&gt;Quando nos exemplos anteriores utilizamos a função &lt;code&gt;fopen()&lt;/code&gt; para abrir um arquivo em PHP, ela retorna um manipulador de arquivo, que é um recurso que representa o arquivo aberto. Esse manipulador de arquivo é usado posteriormente em outras funções de leitura e escrita para realizar operações no arquivo.&lt;/p&gt;

&lt;p&gt;O ponteiro de arquivo é uma posição interna que indica a posição atual de leitura ou escrita no arquivo. Quando você abre um arquivo usando &lt;code&gt;fopen()&lt;/code&gt;, o ponteiro de arquivo é posicionado no início do arquivo por padrão. À medida que você lê ou escreve no arquivo, o ponteiro de arquivo é movido para a próxima posição. Isso permite que você leia ou escreva dados em posições específicas do arquivo. &lt;/p&gt;

&lt;p&gt;No exemplo anterior utilizamos a função &lt;code&gt;filesize()&lt;/code&gt; para recuperar o tamanho em bytes do arquivo, de forma que lemos o arquivo completo de uma única vez. Mas também é possível utilizar a função &lt;code&gt;fread()&lt;/code&gt; para ler parte do arquivo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$handle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;fopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'arquivo.txt'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'r'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$conteudo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;fread&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$handle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Lê os primeiros 100 bytes do arquivo&lt;/span&gt;
&lt;span class="nb"&gt;fclose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$handle&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$conteudo&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Modos de Abertura de Arquivo
&lt;/h4&gt;

&lt;p&gt;Ao usar a função &lt;code&gt;fopen()&lt;/code&gt; para abrir um arquivo em PHP, você deve especificar um modo de abertura para indicar como o arquivo será manipulado. Existem diferentes modos de abertura, que determinam se o arquivo será aberto apenas para leitura, apenas para escrita, para leitura e escrita, e se o ponteiro de arquivo será posicionado no início, no final ou em outras posições do arquivo.&lt;/p&gt;

&lt;p&gt;Alguns dos modos de abertura mais comuns são:&lt;/p&gt;

&lt;p&gt;'r': Abre o arquivo somente para leitura. O ponteiro de arquivo é posicionado no início do arquivo (modo padrão).&lt;br&gt;
'w': Abre o arquivo somente para escrita. &lt;strong&gt;Se o arquivo já existir, seu conteúdo será apagado&lt;/strong&gt;. Se o arquivo não existir, ele será criado.&lt;br&gt;
'a': Abre o arquivo para escrita, mas posiciona o ponteiro de arquivo no final do arquivo. Se o arquivo não existir, ele será criado.&lt;br&gt;
'r+': Abre o arquivo para leitura e escrita. O ponteiro de arquivo é posicionado no início do arquivo.&lt;/p&gt;

&lt;p&gt;Exemplo de uso de fopen() com diferentes modos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$handleRead&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;fopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'arquivo.txt'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'r'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$handleWrite&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;fopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'arquivo.txt'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'w'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$handleAppend&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;fopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'arquivo.txt'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'a'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$handleReadWrite&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;fopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'arquivo.txt'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'r+'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Nota importante&lt;/strong&gt;: conforme mencionado anteriormente, abrir um arquivo em modo &lt;code&gt;w&lt;/code&gt; irá apagar seu conteúdo caso o arquivo já exista. Portanto, tenha cuidado ao usar esse modo de abertura, já que ele pode implicar em perda de dados.&lt;/p&gt;

&lt;h3&gt;
  
  
  Função &lt;code&gt;fclose()&lt;/code&gt; e fechamento de arquivos
&lt;/h3&gt;

&lt;p&gt;Após abrir um manipulador de arquivo em PHP, é importante fechá-lo para que o sistema operacional tenha o recurso liberado. Naturalmente todos os manipuladores de arquivos (e outros tipos de manipuladores do tipo &lt;em&gt;resource&lt;/em&gt;) são liberados após a execução de um script PHP, mas problemas podem acontecer caso você precise lidar novamente com arquivos que foram previamente abertos no mesmo arquivo, como por exemplo se você quiser renomeá-lo. Por isso é sempre uma boa prática fechar os manipuladores que forem abertos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Função &lt;code&gt;file()&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;A função &lt;code&gt;file()&lt;/code&gt; é uma maneira conveniente de ler todo o conteúdo de um arquivo e armazená-lo em um array. Cada elemento do array representa uma linha do arquivo, incluindo os caracteres de quebra linha que existirem no final da linha:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$linhas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'arquivo.txt'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$linhas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$linha&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$linha&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Função &lt;code&gt;unlink()&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;A função &lt;code&gt;unlink()&lt;/code&gt; é usada para excluir um arquivo em PHP. &lt;strong&gt;Cuidado ao utilizar esta função, pois a exclusão é irreversível e não é possível recuperar o arquivo após a remoção&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Exemplo de uso da função &lt;code&gt;unlink()&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;file_exists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'arquivo.txt'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;unlink&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'arquivo.txt'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'Arquivo excluído com sucesso.'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'O arquivo não existe.'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Outras funções e informações sobre manipulação de arquivos em PHP podem ser consultadas &lt;a href="https://www.php.net/manual/en/ref.filesystem.php" rel="noopener noreferrer"&gt;na seção correspondente do manual do PHP&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Manipulação de Arquivos CSV em PHP
&lt;/h2&gt;

&lt;p&gt;O formato CSV (Comma-Separated Values) é amplamente utilizado para armazenar dados tabulares, onde cada linha representa um registro e os valores são separados por vírgulas (ou outros delimitadores). Em PHP, existem funções específicas para lidar com arquivos CSV.&lt;/p&gt;

&lt;h3&gt;
  
  
  Função &lt;code&gt;fgetcsv()&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;A função &lt;code&gt;fgetcsv()&lt;/code&gt; é usada para ler uma linha de um arquivo CSV e retorná-la como um array. Ela identifica automaticamente os campos separados por vírgulas e os coloca em elementos do array. Essa leitura funciona como a função &lt;code&gt;fread()&lt;/code&gt;, movendo o ponteiro interno do arquivo para a próxima linha. Quando a função &lt;code&gt;fgetcsv()&lt;/code&gt; é chamada no final do arquivo, ela retorna o valor booleano &lt;code&gt;false&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$handle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;fopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'dados.csv'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'r'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;$linha&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;fgetcsv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$handle&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;print_r&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$linha&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nb"&gt;fclose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$handle&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Função str_getcsv
&lt;/h3&gt;

&lt;p&gt;A função &lt;code&gt;str_getcsv()&lt;/code&gt; é semelhante à &lt;code&gt;fgetcsv()&lt;/code&gt;, mas ela opera em uma string em vez de um arquivo. Ela analisa uma string CSV e retorna um array com os valores:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$dados&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'João,25,"São Paulo"'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$linha&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;str_getcsv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$dados&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nb"&gt;print_r&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$linha&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Saída: Array ( [0] =&amp;gt; João [1] =&amp;gt; 25 [2] =&amp;gt; São Paulo )&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Função &lt;code&gt;fputcsv()&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;A função fputcsv é usada para escrever uma linha em um arquivo CSV. Ela recebe um array como entrada e escreve os valores separados por vírgulas no arquivo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$dados&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"João"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"São Paulo"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$handle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;fopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'dados.csv'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'a'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nb"&gt;fputcsv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$handle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$dados&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nb"&gt;fclose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$handle&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Manipulação de Strings em PHP
&lt;/h2&gt;

&lt;p&gt;PHP possui uma variedade de funções para a manipulação de strings, permitindo que você realize tarefas como concatenação, busca, substituição, formatação, entre outras.&lt;/p&gt;

&lt;p&gt;Exemplo de manipulação de strings:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$texto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Olá, mundo!'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nb"&gt;strlen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$texto&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Saída: 12 (tamanho da string)&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nb"&gt;strtoupper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$texto&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Saída: OLÁ, MUNDO! (conversão para maiúsculas)&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nb"&gt;str_replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'mundo'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'amigo'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$texto&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Saída: Olá, amigo! (substituição de texto)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Outras funções para manipulação de strings podem ser vistas diretamente no &lt;a href="https://www.php.net/manual/en/ref.strings.php" rel="noopener noreferrer"&gt;manual do php&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Includes e Requires
&lt;/h2&gt;

&lt;p&gt;Em PHP, os includes e requires são utilizados para incluir o conteúdo de outros arquivos PHP no arquivo atual. Isso é útil quando você deseja reutilizar código de outros arquivos ou dividir o código em partes menores para facilitar a manutenção.&lt;/p&gt;

&lt;p&gt;A diferença entre &lt;code&gt;include&lt;/code&gt; e &lt;code&gt;require&lt;/code&gt; é a forma como eles tratam erros. Se um arquivo não for encontrado no &lt;code&gt;include&lt;/code&gt;, o PHP emitirá um aviso (warning) e continuará a execução do script. Já o &lt;code&gt;require&lt;/code&gt; emitirá um erro fatal (fatal error) e interromperá a execução do script caso o arquivo não seja encontrado.&lt;/p&gt;

&lt;p&gt;Exemplo de uso de &lt;code&gt;include&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// arquivo1.php&lt;/span&gt;
&lt;span class="nv"&gt;$mensagem&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Olá, mundo!'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// arquivo2.php&lt;/span&gt;
&lt;span class="k"&gt;include&lt;/span&gt; &lt;span class="s1"&gt;'arquivo1.php'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$mensagem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Saída: Olá, mundo!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exemplo de uso de &lt;code&gt;require&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// arquivo1.php&lt;/span&gt;
&lt;span class="nv"&gt;$mensagem&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Olá, mundo!'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// arquivo2.php&lt;/span&gt;
&lt;span class="k"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'arquivo1.php'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$mensagem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Saída: Olá, mundo!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Manipulação de Datas em PHP
&lt;/h2&gt;

&lt;p&gt;PHP possui diversas funções para a manipulação de datas e horários, permitindo que você trabalhe com datas, faça cálculos, formate datas em diferentes formatos, entre outras operações.&lt;/p&gt;

&lt;p&gt;Exemplo de manipulação de datas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$dataAtual&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Y-m-d'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Obtém a data atual no formato YYYY-MM-DD&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$dataAtual&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nv"&gt;$dataFormatada&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'d/m/Y'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;strtotime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'2023-07-24'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// Converte uma data para o formato DD/MM/YYYY&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$dataFormatada&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mais informações sobre funções relacionadas a datas em PHP podem ser encontradas &lt;a href="https://www.php.net/manual/en/ref.datetime.php" rel="noopener noreferrer"&gt;no manual da linguagem&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;Esses são apenas alguns dos tópicos fundamentais em PHP. Com esses recursos, você pode criar aplicações web dinâmicas, realizar operações com arquivos, manipular strings e trabalhar com datas de forma eficiente e flexível. O PHP é uma linguagem versátil e poderosa que pode ser aplicada em uma ampla variedade de cenários de desenvolvimento web. Com a prática e o aprendizado contínuo, você poderá aprimorar suas habilidades em PHP e desenvolver aplicações cada vez mais complexas e avançadas.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Linguagem PHP: Introdução ao Desenvolvimento Web</title>
      <dc:creator>Ranieri Valença</dc:creator>
      <pubDate>Tue, 25 Jul 2023 14:20:22 +0000</pubDate>
      <link>https://dev.to/ranierivalenca/linguagem-php-introducao-ao-desenvolvimento-web-1ioa</link>
      <guid>https://dev.to/ranierivalenca/linguagem-php-introducao-ao-desenvolvimento-web-1ioa</guid>
      <description>&lt;h2&gt;
  
  
  Tópicos
&lt;/h2&gt;

&lt;p&gt; 1. Introdução&lt;br&gt;
 2. Interpretador de PHP&lt;br&gt;
       2.1. Tags de Marcação de Início e Fim&lt;br&gt;
             a. Códigos Fora das Tags:&lt;br&gt;
       2.2. Comentários&lt;br&gt;
       2.3. Tipos de Dados&lt;br&gt;
       2.4. Operadores&lt;br&gt;
       2.5. Variáveis&lt;br&gt;
       2.6. Estruturas de Controle:&lt;br&gt;
       2.7. Arrays e Arrays Associativos&lt;br&gt;
       2.8. Loop foreach&lt;br&gt;
       2.9. Loops com dois pontos e end&lt;br&gt;
       2.10. Sintaxe Resumida do Echo&lt;br&gt;
       2.11. Fim de Bloco de Código e Último Bloco de Código de um Arquivo&lt;br&gt;
       2.12. Intercambiando Códigos PHP com HTML&lt;br&gt;
             a. Exemplo com laço FOREACH&lt;br&gt;
             b. Exemplo de instrução condicional IF/ELSE&lt;br&gt;
 3. Conclusão&lt;/p&gt;
&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;PHP é uma linguagem de programação amplamente utilizada para desenvolvimento web. Criada por Rasmus Lerdorf em 1994, PHP (que inicialmente significava "Personal Home Page", mas agora é uma sigla recursiva para "PHP: Hypertext Preprocessor") evoluiu para se tornar uma ferramenta poderosa e flexível para criar aplicações web dinâmicas.&lt;/p&gt;
&lt;h2&gt;
  
  
  Interpretador de PHP
&lt;/h2&gt;

&lt;p&gt;PHP é uma linguagem interpretada, o que significa que o código-fonte PHP é lido e executado linha por linha durante o tempo de execução, em vez de ser compilado em um programa independente. O interpretador de PHP é um software que interpreta e executa os scripts PHP. Quando você executa um script PHP diretamente da linha de comando, os resultados são mostrados diretamente no terminal.&lt;/p&gt;
&lt;h3&gt;
  
  
  Tags de Marcação de Início e Fim
&lt;/h3&gt;

&lt;p&gt;Em PHP, o código a ser interpretado é delimitado por tags de marcação especiais que indicam ao interpretador onde o código PHP começa e termina. As tags de marcação padrão são:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class="c1"&gt;// Código PHP aqui&lt;/span&gt;
&lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Também é comum usar a tag curta &lt;code&gt;&amp;lt;?&lt;/code&gt;, mas é importante notar que nem todos os servidores web suportam essa forma curta de tag e pode estar desabilitada nas configurações de PHP. No entanto, ao executar o script diretamente da linha de comando, as tags curtas geralmente são suportadas.&lt;/p&gt;

&lt;h4&gt;
  
  
  Códigos Fora das Tags:
&lt;/h4&gt;

&lt;p&gt;Quando você executa um script PHP diretamente da linha de comando, qualquer conteúdo fora das tags de marcação &amp;lt;?php ?&amp;gt; é tratado como saída padrão e é exibido diretamente no terminal. Isso significa que você pode usar o PHP para gerar e mostrar informações no terminal, mesmo que não esteja rodando o script em um servidor web. Isso também significa que você pode escrever qualquer coisa fora das tags de marcação PHP para serem escritas diretamente na saída.&lt;/p&gt;

&lt;p&gt;Por exemplo, considere que o código a seguir chama-se &lt;code&gt;script.php&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;Olá, sua idade é: &lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class="nv"&gt;$idade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$idade&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uma chamada no terminal por&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php script.php
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Teria como resultado&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Olá, sua idade é 18
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se o seu código não contiver nenhuma tag PHP, o resultado da execução do script usando o interpretador do PHP será exatamente o conteúdo do arquivo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Comentários
&lt;/h3&gt;

&lt;p&gt;Em PHP, você pode adicionar comentários para documentar seu código. Comentários são trechos de texto que não são executados pelo interpretador e servem apenas para explicar o que o código faz. Existem dois tipos de comentários em PHP:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Comentários de uma única linha:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Este é um comentário de uma única linha&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Comentários de múltiplas linhas:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cm"&gt;/* 
   Este é um comentário 
   de múltiplas linhas
*/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Tipos de Dados
&lt;/h3&gt;

&lt;p&gt;PHP suporta vários tipos de dados:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;int&lt;/strong&gt;: Números inteiros, por exemplo, 10, -5, 1000.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;float&lt;/strong&gt;: Números com casas decimais, por exemplo, 3.14, -0.5.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;string&lt;/strong&gt;: Sequência de caracteres, por exemplo, "Olá mundo!", 'PHP é divertido!'.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;boolean&lt;/strong&gt;: Representa verdadeiro (&lt;code&gt;true&lt;/code&gt;) ou falso (&lt;code&gt;false&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;null&lt;/strong&gt;: Representa a ausência de valor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;array&lt;/strong&gt;: Coleção de elementos, indexada numericamente.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;object&lt;/strong&gt;: Instâncias de classes definidas pelo usuário.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;resource&lt;/strong&gt;: Referência a recursos externos, como conexões de banco de dados ou manipuladores de arquivos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;callable&lt;/strong&gt;: Representa um objeto ou função que pode ser chamado.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Operadores
&lt;/h3&gt;

&lt;p&gt;PHP suporta diversos tipos de operadores:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Aritméticos&lt;/strong&gt;: &lt;code&gt;+&lt;/code&gt; (adição), &lt;code&gt;-&lt;/code&gt; (subtração), &lt;code&gt;*&lt;/code&gt; (multiplicação), &lt;code&gt;/&lt;/code&gt; (divisão), &lt;code&gt;%&lt;/code&gt; (módulo).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;De Comparação&lt;/strong&gt;: &lt;code&gt;==&lt;/code&gt; (igual), &lt;code&gt;!=&lt;/code&gt; (diferente), &lt;code&gt;&amp;gt;&lt;/code&gt; (maior que), &lt;code&gt;&amp;lt;&lt;/code&gt; (menor que), &lt;code&gt;&amp;gt;=&lt;/code&gt; (maior ou igual), &lt;code&gt;&amp;lt;=&lt;/code&gt; (menor ou igual).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lógicos&lt;/strong&gt;: &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; (E lógico), &lt;code&gt;||&lt;/code&gt; (OU lógico), &lt;code&gt;!&lt;/code&gt; (NÃO lógico).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;De Atribuição&lt;/strong&gt;: &lt;code&gt;=&lt;/code&gt; (atribuição simples), &lt;code&gt;+=&lt;/code&gt; (adição com atribuição), &lt;code&gt;-=&lt;/code&gt; (subtração com atribuição), &lt;code&gt;*=&lt;/code&gt; (multiplicação com atribuição), &lt;code&gt;/=&lt;/code&gt; (divisão com atribuição), entre outros.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;De Incremento e Decremento&lt;/strong&gt;: &lt;code&gt;++&lt;/code&gt; (incremento), &lt;code&gt;--&lt;/code&gt; (decremento).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ternário&lt;/strong&gt;: &lt;code&gt;condição ? valor_se_verdadeiro : valor_se_falso&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Concatenador&lt;/strong&gt;: &lt;code&gt;.&lt;/code&gt; (para concatenar strings).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Igualdade e Diferença Estritas&lt;/strong&gt;: &lt;code&gt;===&lt;/code&gt; (igualdade estrita) e &lt;code&gt;!==&lt;/code&gt; (diferença estrita).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Os operadores de igualdade estrita (&lt;code&gt;===&lt;/code&gt;) e diferença estrita (&lt;code&gt;!==&lt;/code&gt;) são usados para comparar tanto o valor quanto o tipo de dados de duas expressões. Isso significa que, ao usar &lt;code&gt;===&lt;/code&gt;, as expressões devem ser idênticas em valor e tipo para que a comparação seja considerada verdadeira. Por outro lado, com &lt;code&gt;!==&lt;/code&gt;, a comparação é verdadeira se as expressões tiverem valores ou tipos diferentes. Esses operadores são importantes quando é necessário garantir que tanto o valor quanto o tipo sejam levados em consideração durante as comparações.&lt;/p&gt;

&lt;h3&gt;
  
  
  Variáveis
&lt;/h3&gt;

&lt;p&gt;As variáveis em PHP são precedidas pelo símbolo de dólar &lt;code&gt;$&lt;/code&gt; e podem ser definidas dinamicamente sem a necessidade de declarar um tipo. Veja um exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"João"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$idade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Estruturas de Controle:
&lt;/h3&gt;

&lt;p&gt;As estruturas de controle em PHP são muito similares a outras linguagens de programação do tipo C-like, como JavaScript. Elas permitem que você controle o fluxo do programa. As principais estruturas de controle são:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IF, ELSEIF e ELSE:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$idade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$idade&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Você é maior de idade."&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;elseif&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$idade&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Você é adolescente."&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Você é menor de idade."&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;FOR:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;$i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Número: "&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$i&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;WHILE:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Número: "&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$i&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;DO-WHILE:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Número: "&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$i&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Arrays e Arrays Associativos
&lt;/h3&gt;

&lt;p&gt;Arrays são coleções de elementos que podem ser indexados numericamente iniciando no &lt;code&gt;0&lt;/code&gt;, assim como em C ou JavaScript. Em PHP, os arrays podem ser criados usando a função array() ou a notação de colchetes [] a partir da versão 5.4. &lt;/p&gt;

&lt;p&gt;Dado o fato de que PHP é uma linguagem com tipagem dinâmica, os arrays podem ser mistos, ou seja, contendo elementos de diversos tipos de dados.&lt;/p&gt;

&lt;p&gt;Veja um exemplo de array:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$frutas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"maçã"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"banana"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"laranja"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// [0] =&amp;gt; "maçã" / [1] =&amp;gt; "banana" / [2] =&amp;gt; "laranja"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Além disso, os arrays em PHP podem ter chaves não numéricas. Esses arrays são chamados de arrays associativos, e são arrays onde cada elemento tem uma chave do tipo string associada. Veja um exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$aluno&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"nome"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"Maria"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"idade"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"nota"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;9.5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Loop foreach
&lt;/h3&gt;

&lt;p&gt;O loop foreach é especialmente útil para iterar sobre os elementos de um array. Ele percorre cada elemento do array e executa um bloco de código para cada elemento. Veja um exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$frutas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"maçã"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"banana"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"laranja"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$frutas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$fruta&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$fruta&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso produzirá a seguinte saída no terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;maçã
banana
laranja
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No caso de arrays associativos, você pode acessar tanto a chave quanto o valor usando a seguinte sintaxe:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$aluno&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"nome"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"Maria"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"idade"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"nota"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;9.5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$aluno&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$chave&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$valor&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$chave&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s2"&gt;": "&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$valor&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso produzirá a seguinte saída no terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nome: Maria
idade: 20
nota: 9.5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Loops com dois pontos e end
&lt;/h3&gt;

&lt;p&gt;Outra forma de escrever loops em PHP é delimitando o bloco de código do loop usando dois pontos (&lt;code&gt;:&lt;/code&gt;) e &lt;code&gt;end[nome do loop]&lt;/code&gt;. Essa forma torna o código mais legível quando se trabalha com blocos grandes de HTML que estão dentro do bloco do laço. Veja os exemplos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$frutas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"maçã"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"banana"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"laranja"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;$i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nb"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$frutas&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$frutas&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;endfor&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No caso de arrays associativos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$aluno&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"nome"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"Maria"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"idade"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"nota"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;9.5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$aluno&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$chave&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$valor&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$chave&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s2"&gt;": "&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$valor&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;endforeach&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Sintaxe Resumida do Echo
&lt;/h3&gt;

&lt;p&gt;Para imprimir valores na saída, você também pode usar a sintaxe resumida do &lt;code&gt;echo&lt;/code&gt;, utilizando &lt;code&gt;&amp;lt;?= $valor ?&amp;gt;&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Maria"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Olá, "&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$nome&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s2"&gt;"!"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Saída: Olá, Maria!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pode ser escrito de forma mais concisa usando a sintaxe resumida:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class="nv"&gt;$nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Maria"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;
Olá, &lt;span class="cp"&gt;&amp;lt;?=&lt;/span&gt; &lt;span class="nv"&gt;$nome&lt;/span&gt; &lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;! &lt;span class="c"&gt;&amp;lt;!-- Saída: Olá, Maria! --&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Fim de Bloco de Código e Último Bloco de Código de um Arquivo
&lt;/h3&gt;

&lt;p&gt;Em PHP, a última linha de um bloco de código não precisa de ponto e vírgula (&lt;code&gt;;&lt;/code&gt;). Isso torna mais fácil adicionar ou remover linhas de código sem se preocupar com o ponto e vírgula na última linha.&lt;/p&gt;

&lt;p&gt;Além disso, quando o arquivo PHP termina com um bloco de código, o último bloco de PHP não precisa ser fechado com &lt;code&gt;?&amp;gt;&lt;/code&gt;. Essa prática é comum em arquivos que contêm apenas código PHP e não incluem HTML ou outras marcações. Deixar o último bloco sem o fechamento &lt;code&gt;?&amp;gt;&lt;/code&gt; ajuda a evitar espaços em branco ou caracteres adicionais após o fechamento do PHP, o que poderia causar erros em determinadas situações.&lt;/p&gt;

&lt;h3&gt;
  
  
  Intercambiando Códigos PHP com HTML
&lt;/h3&gt;

&lt;p&gt;Uma das principais vantagens do PHP é a capacidade de intercambiar códigos PHP com HTML, permitindo a criação de páginas web dinâmicas, onde o conteúdo pode variar de acordo com as condições definidas no código PHP. Isso é especialmente útil quando se trabalha com estruturas de controle, como laços e instruções condicionais, que podem ser facilmente integradas ao HTML usando a sintaxe de dois pontos e &lt;code&gt;end&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Vamos ver como podemos utilizar a sintaxe de dois pontos e &lt;code&gt;end&lt;/code&gt; para intercalar estruturas de controle PHP com blocos de HTML.&lt;/p&gt;

&lt;h4&gt;
  
  
  Exemplo com laço FOREACH
&lt;/h4&gt;

&lt;p&gt;Suponha que temos um array contendo alguns nomes de frutas e queremos exibi-los em uma lista não ordenada (&lt;code&gt;&amp;lt;ul&amp;gt;&lt;/code&gt;) em nosso HTML:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class="nv"&gt;$frutas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"maçã"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"banana"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"laranja"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;
&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt; &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$frutas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$fruta&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&amp;lt;?=&lt;/span&gt; &lt;span class="nv"&gt;$fruta&lt;/span&gt; &lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt; &lt;span class="k"&gt;endforeach&lt;/span&gt; &lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O laço &lt;code&gt;foreach&lt;/code&gt; percorre o array &lt;code&gt;$frutas&lt;/code&gt; e para cada elemento, o código HTML é gerado dentro do laço, exibindo cada fruta em um elemento &lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt; da lista não ordenada. Note também que aqui estamos usando o &lt;code&gt;endforeach&lt;/code&gt; sem ponto-e-vírgula no final, já que ele é o último (e único) comando do bloco em questão. O mesmo acontece o bloco que escreve a variável &lt;code&gt;$fruta&lt;/code&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Exemplo de instrução condicional IF/ELSE
&lt;/h4&gt;

&lt;p&gt;Suponha que temos uma variável &lt;code&gt;$idade&lt;/code&gt; e queremos exibir uma mensagem personalizada com base na idade em nosso HTML:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class="nv"&gt;$idade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;
&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$idade&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Você é maior de idade.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Você é menor de idade.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt; &lt;span class="k"&gt;endif&lt;/span&gt; &lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, usamos a instrução condicional &lt;code&gt;if/else&lt;/code&gt; para verificar se a idade é maior ou igual a 18. Dependendo do resultado, exibimos uma mensagem apropriada no HTML usando &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt; (parágrafo).&lt;/p&gt;

&lt;p&gt;Essa abordagem facilita a criação de páginas web dinâmicas, pois podemos incorporar lógica de programação PHP diretamente em nossos arquivos HTML. Dessa forma, podemos construir interfaces interativas que se adaptam a diferentes cenários e situações, proporcionando uma experiência mais personalizada e agradável aos usuários.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Com isso, você já é capaz de construir scripts simples utilizando PHP e HTML (ou apenas texto puro, se assim desejar) e executá-los no terminal para ver os resultados.&lt;/p&gt;

&lt;p&gt;A seguir, vamos falar sobre mais alguns recursos importantes da linguagem PHP e abordar questões relacionadas ao modelo cliente-servidor e o protocolo HTTP que são os fundamentos da Internet.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Fundamentos do Desenvolvimento Web: uma rápida revisão</title>
      <dc:creator>Ranieri Valença</dc:creator>
      <pubDate>Mon, 24 Jul 2023 18:43:47 +0000</pubDate>
      <link>https://dev.to/ranierivalenca/fundamentos-do-desenvolvimento-web-uma-rapida-revisao-15cj</link>
      <guid>https://dev.to/ranierivalenca/fundamentos-do-desenvolvimento-web-uma-rapida-revisao-15cj</guid>
      <description>&lt;h2&gt;
  
  
  Tópicos
&lt;/h2&gt;

&lt;p&gt; 1. Introdução&lt;br&gt;
 2. Sistema Operacional&lt;br&gt;
       2.1. Terminal de comando&lt;br&gt;
 3. Sistema de Arquivos e Diretórios&lt;br&gt;
       3.1. Programas e Linguagem de Programação&lt;br&gt;
             a. Linguagens Compiladas&lt;br&gt;
             b. Linguagens Interpretadas&lt;br&gt;
 4. Comandos básicos do terminal&lt;br&gt;
 5. PATH&lt;br&gt;
 6. Editor de Texto e IDE&lt;br&gt;
       6.1. O VSCode&lt;br&gt;
 7. Utilizando o Windows Subsystem for Linux (WSL) no Windows&lt;br&gt;
       7.1. Habilitando o WSL&lt;br&gt;
       7.2. Iniciando e Utilizando o WSL&lt;br&gt;
       7.3. Intercâmbio com o Windows&lt;br&gt;
       7.4. Desenvolvimento Web com WSL&lt;br&gt;
 8. Codificação de Caracteres e UTF-8&lt;br&gt;
       8.1. ASCII (American Standard Code for Information Interchange)&lt;br&gt;
       8.2. Unicode&lt;br&gt;
       8.3. UTF-8 (Unicode Transformation Format - 8 bits)&lt;br&gt;
       8.4. Quebras de Linha, Retorno de Carro e Escape de Caracteres em Strings&lt;/p&gt;
&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Antes de começarmos a entender os conceitos básicos de desenvolvimento web, é importante revisar alguns conhecimentos fundamentais de computação e programação. Por isto este artigo trata de alguns conceitos importantes desde sistemas operacionais até a utilização de IDEs e terminais de comando.&lt;/p&gt;


&lt;h2&gt;
  
  
  Sistema Operacional
&lt;/h2&gt;

&lt;p&gt;Um sistema operacional é um software fundamental que atua como uma interface entre o hardware do computador e os programas que são executados nele. Ele gerencia os recursos do sistema, como processador, memória, dispositivos de entrada e saída, e permite que os usuários interajam com o computador de forma eficiente. Naturalmente dentro do mundo do Desenvolvimento Web, lidamos com três tipos de sistemas operacionais diferentes: Windows, Linux e MacOS. Cada um destes sistemas possui características diferentes dos demais, mas funcionalmente ambos se comportam de maneira similar no tocante ao desenvolvimento, visto que a nível de kernel todos têm funções semelhantes (apesar de diferenças significativas no tocante a, por exemplo, instalação de aplicações).&lt;/p&gt;

&lt;p&gt;Um aspecto importante a ser abordado sobre os sistemas operacionais é o terminal de comando, que abordaremos a seguir.&lt;/p&gt;
&lt;h3&gt;
  
  
  Terminal de comando
&lt;/h3&gt;

&lt;p&gt;O terminal de comando, também conhecido como prompt de comando ou shell, é uma interface de linha de comando que permite aos usuários interagir diretamente com o sistema operacional por meio de comandos textuais. Enquanto a maioria dos usuários interage com o sistema operacional através de uma interface gráfica, o terminal oferece uma maneira poderosa e eficiente de executar tarefas e comandos complexos.&lt;/p&gt;

&lt;p&gt;No contexto de desenvolvimento de Aplicações Web, é bastante comum utilizar o terminal de comando para automatizar tarefas, manipular diretórios e arquivos, instalar ou remover programas e dependências e para fazer configurações. Apesar de algumas destas tarefas poderem ser executadas de forma até mesmo mais eficiente através da interface gráfica (como por exemplo a manipulação de arquivos), a utilização do terminal de comando é geralmente recomendada quando trabalhamos com desenvolvimento de aplicações.&lt;/p&gt;

&lt;p&gt;Mais a frente falaremos de alguns comandos básicos do terminal de comando.&lt;/p&gt;


&lt;h2&gt;
  
  
  Sistema de Arquivos e Diretórios
&lt;/h2&gt;

&lt;p&gt;O sistema de arquivos é a base para o armazenamento e organização de dados em um computador. Os dados são armazenados em arquivos, que por sua vez ficam armazenados em pastas (ou diretórios). Cada uma destas pastas pode estar dentro de outras pastas, formando uma estrutura hierárquica.&lt;/p&gt;

&lt;p&gt;Cada arquivo ou diretório possui um nome, que serve como seu identificador. Em sistemas Linux, os nomes são &lt;em&gt;case sensitives&lt;/em&gt; ("sensíveis ao caso"), o que significa que letras maiúsculas e minúsculas são tratadas de forma diferente. Assim, &lt;code&gt;arquivo.txt&lt;/code&gt; é diferente de &lt;code&gt;Arquivo.txt&lt;/code&gt;, mesmo que ambos estejam dentro do mesmo diretório. Esta mesma observação vale para diretórios, portanto é importante estar atento às letras maiúsculas e minúsculas enquanto estiver lidando com arquivos.&lt;/p&gt;

&lt;p&gt;Outro ponto importante a ser lembrado é que essa estrutura hierárquica tem um fim, o que chamamos de &lt;strong&gt;diretório raiz&lt;/strong&gt;. O diretório raiz em sistemas de arquivos baseados em Unix (Linux e MacOS, por exemplo), é o &lt;code&gt;/&lt;/code&gt;; este é o ponto de montagem do sistema de arquivos. No caso de sistemas Windows, a raiz é geralmente indicada por uma letra (&lt;code&gt;C:&lt;/code&gt; ou &lt;code&gt;D:&lt;/code&gt;, por exemplo).&lt;/p&gt;

&lt;p&gt;Assim, dentro dessa estrutura hierárquica e sabendo da identificação através de nomes, o &lt;em&gt;caminho&lt;/em&gt; de um arquivo é a estrutura de diretórios em que ele está contido desde a raiz. Por exemplo, &lt;code&gt;C:\users\ranieri\Desktop\teste.txt&lt;/code&gt; ou &lt;code&gt;/home/ranieri/desktop/teste.txt&lt;/code&gt;. Isto é o que chamamos de &lt;em&gt;caminho absoluto&lt;/em&gt;, pois é o caminho completo do arquivo desde a raiz. Podemos também ter caminhos relativos. Neste caso, &lt;code&gt;.&lt;/code&gt; refere-se ao diretório em questão onde o arquivo está e &lt;code&gt;..&lt;/code&gt; refere-se ao diretório raiz.&lt;/p&gt;

&lt;p&gt;Por exemplo, considere que estamos "olhando" o arquivo &lt;code&gt;/home/ranieri/desktop/teste.txt&lt;/code&gt;. A partir deste arquivo, se quisermos referenciar um arquivo &lt;code&gt;nomes.txt&lt;/code&gt; que está no mesmo diretório (&lt;code&gt;/home/ranieri/desktop/nomes.txt&lt;/code&gt;), poderíamos referenciá-lo usando &lt;code&gt;./nomes.txt&lt;/code&gt;, já que ele está no mesmo diretório. Se, por outro lado, quiséssemos referenciar o arquivo localizado em &lt;code&gt;/home/ranieri/.ssh/id_rsa&lt;/code&gt; teríamos que usar o identificador   &lt;code&gt;../.ssh/id_rsa&lt;/code&gt;, ou seja, voltando ao diretório pai (&lt;code&gt;../&lt;/code&gt; refere-se à &lt;code&gt;/home/ranieri&lt;/code&gt;, diretório pai de &lt;code&gt;desktop&lt;/code&gt; que é onde o arquivo &lt;code&gt;teste.txt&lt;/code&gt; está localizado).&lt;/p&gt;


&lt;h3&gt;
  
  
  Programas e Linguagem de Programação
&lt;/h3&gt;

&lt;p&gt;Em termos simples, um programa é um conjunto de instruções escritas por um programador para que um computador execute tarefas específicas. Essas tarefas podem ser desde cálculos matemáticos até a execução de ações complexas em aplicativos, jogos ou servidores web. Os programas são a base de tudo o que fazemos em nossos computadores e dispositivos eletrônicos.&lt;/p&gt;

&lt;p&gt;Já as linguagens de programação são conjuntos de regras e instruções utilizadas para desenvolver programas e aplicativos de computador. Elas servem como uma ponte de comunicação entre os seres humanos e as máquinas, permitindo que os programadores expressem suas ideias e lógica de programação de maneira estruturada e compreensível para os computadores.&lt;/p&gt;
&lt;h4&gt;
  
  
  Linguagens Compiladas
&lt;/h4&gt;

&lt;p&gt;Linguagens de programação compiladas são aquelas em que o código-fonte é traduzido para código de máquina antes da execução do programa. O processo de compilação é realizado por um software chamado compilador, que analisa todo o código-fonte e o converte em um arquivo executável específico para o sistema operacional em que o programa será executado. Esse arquivo executável é independente do código-fonte original e pode ser distribuído para ser executado em diferentes sistemas, desde que exista uma versão compatível do compilador para cada plataforma.&lt;/p&gt;

&lt;p&gt;Exemplos de linguagens compiladas incluem C, C++, Rust e Go. Quando um programa é escrito nessas linguagens, o código-fonte é traduzido em linguagem de máquina (também chamado de binário) pelo compilador antes da execução.&lt;/p&gt;
&lt;h4&gt;
  
  
  Linguagens Interpretadas
&lt;/h4&gt;

&lt;p&gt;Linguagens de programação interpretadas são aquelas em que o código-fonte é traduzido para código de máquina linha por linha em tempo real, enquanto o programa é executado. Em vez de gerar um arquivo executável independente, o código-fonte é lido e interpretado por um programa chamado interpretador. O interpretador executa cada instrução do código em sequência, realizando as ações necessárias conforme encontradas no programa.&lt;/p&gt;

&lt;p&gt;Exemplos de linguagens interpretadas incluem Python, JavaScript, Ruby e PHP. Ao executar um programa escrito nessas linguagens, é necessário ter o interpretador instalado no sistema operacional, pois ele será responsável por interpretar e executar o código. Por exemplo, quando executamos um código escrito em JavaScript, é comum fazermos uma chamada no terminal de comando similar a:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node my_code.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso significa que o programa &lt;code&gt;node&lt;/code&gt; será executado e irá interpretar o código escrito no arquivo &lt;code&gt;my_code.js&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Comandos básicos do terminal
&lt;/h2&gt;

&lt;p&gt;Aqui vamos tratar alguns comandos extremamente básicos para utilizar o terminal de comando usando tanto Windows quando Linux (estes comandos no MacOS serão iguais aos do Linux)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Listar Arquivos e Diretórios:&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Windows:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dir
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Linux:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ls
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Mudar de Diretório:&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Windows:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd [nome do diretório]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Linux:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd [nome do diretório]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Criar Diretório:&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Windows:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir [nome do diretório]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Linux:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir [nome do diretório]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Limpar a Tela do Terminal:&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Windows:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cls
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Linux:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;clear
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Copiar Arquivos:&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Windows:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;copy [origem] [destino]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Linux:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cp [origem] [destino]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Mover Arquivos:&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Windows:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;move [origem] [destino]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Linux:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mv [origem] [destino]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Remover Arquivos:&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Windows:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;del [nome do arquivo]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Linux:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rm [nome do arquivo]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Executar um Programa:&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Windows:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[programa].exe
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Linux:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;./[programa]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;É importante notar que, além das diferenças nos comandos, os sistemas operacionais têm algumas particularidades em relação à estrutura de diretórios e aos nomes de arquivos. No Windows, utiliza-se o caractere de barra invertida &lt;code&gt;\&lt;/code&gt; para separar diretórios, enquanto no Linux usa-se a barra &lt;code&gt;/&lt;/code&gt;. Além disso, como já falamos anteriormente, no Windows, os nomes de arquivos e diretórios não diferenciam maiúsculas de minúsculas, enquanto no Linux, são considerados como diferentes.&lt;/p&gt;




&lt;h2&gt;
  
  
  PATH
&lt;/h2&gt;

&lt;p&gt;O conceito de PATH é fundamental para entender como os comandos são executados. O PATH é uma variável de ambiente (um valor nomeado que pode ser acessado e utilizado por programas em um sistema operacional para armazenar informações relevantes) que contém uma lista de diretórios em que o sistema operacional procura por executáveis quando um comando é digitado no terminal.&lt;/p&gt;

&lt;p&gt;Quando um comando é inserido no terminal, o sistema verifica o diretório atual (o diretório em que o usuário está no momento) e, em seguida, busca o comando nos diretórios listados na variável PATH. Se o executável do comando for encontrado em um desses diretórios, o sistema executará o comando. Caso contrário, o sistema exibirá uma mensagem de erro indicando que o comando não foi encontrado.&lt;/p&gt;

&lt;p&gt;A configuração adequada do PATH é essencial para garantir que os comandos sejam executados corretamente, principalmente quando se trabalha com desenvolvimento de aplicações web, pois muitas vezes é necessário utilizar ferramentas e programas que são instalados em diretórios específicos.&lt;/p&gt;

&lt;p&gt;Por exemplo, ao instalar ferramentas como o Node.js, o PHP ou o Python em um sistema operacional, essas ferramentas geralmente são adicionadas aos diretórios do PATH para que possam ser acessadas de qualquer local no terminal de comando. Isso permite que os desenvolvedores executem essas ferramentas diretamente do terminal, sem a necessidade de fornecer o caminho completo para o executável.&lt;/p&gt;

&lt;p&gt;A configuração do PATH varia de acordo com o sistema operacional utilizado. No Windows, por exemplo, é possível configurá-lo através das variáveis de ambiente do sistema, dentro do Painel de Controle. Já no Linux e MacOS, o PATH pode ser configurado no arquivo de perfil do usuário, como o &lt;code&gt;.bashrc&lt;/code&gt; ou o &lt;code&gt;.bash_profile&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;No desenvolvimento de aplicações web, ter um PATH configurado adequadamente é crucial para garantir a facilidade de uso e a eficiência das ferramentas e comandos utilizados no terminal de comando. Com o PATH configurado corretamente, os desenvolvedores podem agilizar suas tarefas e aproveitar ao máximo as capacidades oferecidas pelo terminal de comando em seus projetos.&lt;/p&gt;




&lt;h2&gt;
  
  
  Editor de Texto e IDE
&lt;/h2&gt;

&lt;p&gt;Um editor de texto é uma ferramenta essencial para escrever código, e uma IDE (Ambiente de Desenvolvimento Integrado) oferece recursos adicionais para facilitar o desenvolvimento.&lt;/p&gt;

&lt;h3&gt;
  
  
  O VSCode
&lt;/h3&gt;

&lt;p&gt;O Visual Studio Code (VSCode) é um dos editores de texto mais populares no desenvolvimento web moderno. Uma das suas principais vantagens é sua vasta biblioteca de extensões que oferecem recursos adicionais e suporte para várias linguagens de programação e frameworks. Com estas extensões e plugins é possível torná-lo uma IDE, com todas as funcionalidades necessárias para o desenvolvimento.&lt;/p&gt;

&lt;p&gt;Além disso, é possível personalizar as configurações do VSCode de forma a otimizar seu fluxo de trabalho, alterando atalhos para funções usadas comumente ou alterando as cores do tema para melhorar sua acessibilidade.&lt;/p&gt;




&lt;h2&gt;
  
  
  Utilizando o Windows Subsystem for Linux (WSL) no Windows
&lt;/h2&gt;

&lt;p&gt;O Windows Subsystem for Linux (WSL) é uma ferramenta poderosa que permite aos usuários do Windows executar uma distribuição Linux completa diretamente no sistema operacional Windows. Isso possibilita a utilização de comandos e ferramentas nativas do Linux no ambiente do Windows, incluindo no desenvolvimento web.&lt;/p&gt;

&lt;h3&gt;
  
  
  Habilitando o WSL
&lt;/h3&gt;

&lt;p&gt;Para utilizar o WSL, é necessário habilitá-lo no Windows. Nas versões mais recentes do Windows, o WSL está disponível como uma funcionalidade integrada. Para habilitá-lo, siga estes passos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Abra o "Painel de Controle" do Windows.&lt;/li&gt;
&lt;li&gt;Clique em "Programas" ou "Programas e Recursos".&lt;/li&gt;
&lt;li&gt;No painel esquerdo, clique em "Ativar ou desativar recursos do Windows".&lt;/li&gt;
&lt;li&gt;Localize "Windows Subsystem for Linux" na lista e marque a caixa de seleção ao lado.&lt;/li&gt;
&lt;li&gt;Clique em "OK" e aguarde o Windows fazer as alterações necessárias.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Após habilitar o WSL, você precisará instalar uma distribuição Linux através da Microsoft Store. Atualmente, existem várias opções disponíveis, incluindo o Ubuntu, Debian, Fedora e outras.&lt;/p&gt;

&lt;h3&gt;
  
  
  Iniciando e Utilizando o WSL
&lt;/h3&gt;

&lt;p&gt;Após instalar a distribuição Linux de sua escolha, você pode iniciá-la como qualquer outro aplicativo do Windows. Basta procurar a distribuição no menu Iniciar e clicar em "Iniciar" para abrir um terminal Linux diretamente no Windows.&lt;/p&gt;

&lt;p&gt;No ambiente do WSL, você pode utilizar os mesmos comandos e ferramentas que usaria em um sistema Linux tradicional. Isso inclui comandos como &lt;code&gt;ls&lt;/code&gt;, &lt;code&gt;cd&lt;/code&gt;, &lt;code&gt;mkdir&lt;/code&gt;, &lt;code&gt;rm&lt;/code&gt;, entre outros. Além disso, você pode instalar pacotes e bibliotecas usando o gerenciador de pacotes da distribuição Linux que você escolheu.&lt;/p&gt;

&lt;h3&gt;
  
  
  Intercâmbio com o Windows
&lt;/h3&gt;

&lt;p&gt;Um dos recursos interessantes do WSL é a capacidade de intercambiar arquivos e diretórios entre o ambiente do Windows e o ambiente Linux. Dentro do terminal do WSL, você pode acessar os arquivos do Windows através do caminho &lt;code&gt;/mnt/c/&lt;/code&gt; (ou &lt;code&gt;/mnt/d/&lt;/code&gt; para outra partição, se aplicável).&lt;/p&gt;

&lt;p&gt;Por exemplo, para acessar a pasta "Documentos" do Windows no ambiente do WSL, você pode utilizar o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd /mnt/c/Users/SeuUsuario/Documents
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dessa forma, você pode trabalhar com os arquivos em ambos os ambientes de forma integrada.&lt;/p&gt;

&lt;h3&gt;
  
  
  Desenvolvimento Web com WSL
&lt;/h3&gt;

&lt;p&gt;O WSL é especialmente útil no desenvolvimento web, pois permite que você utilize todas as ferramentas e comandos familiares do ambiente Linux sem precisar sair do sistema operacional Windows. Você pode executar servidores web, compilar código, gerenciar pacotes e dependências, e realizar outras tarefas típicas do desenvolvimento web diretamente no terminal do WSL.&lt;/p&gt;

&lt;p&gt;Além disso, a integração com o Visual Studio Code (VSCode) é bastante fluída, permitindo que você utilize o editor de texto para desenvolvimento web com suporte total ao ambiente do WSL.&lt;/p&gt;




&lt;h2&gt;
  
  
  Codificação de Caracteres e UTF-8
&lt;/h2&gt;

&lt;p&gt;No desenvolvimento web, a codificação de caracteres é um aspecto essencial para garantir que os dados sejam representados corretamente e possam ser interpretados corretamente pelos navegadores e servidores. Nesta seção, abordaremos alguns conceitos importantes sobre a codificação de caracteres, incluindo ASCII, Unicode e UTF-8.&lt;/p&gt;

&lt;h3&gt;
  
  
  ASCII (American Standard Code for Information Interchange)
&lt;/h3&gt;

&lt;p&gt;O ASCII é um dos primeiros padrões de codificação de caracteres amplamente utilizado na computação. Ele foi desenvolvido nos anos 60 e utiliza um conjunto de 128 caracteres diferentes, incluindo letras maiúsculas e minúsculas, números, símbolos de pontuação e caracteres especiais, como tabulação e quebra de linha. Cada caractere é representado por um valor numérico de 7 bits, variando de 0 a 127.&lt;/p&gt;

&lt;p&gt;Por exemplo, o valor ASCII para a letra 'A' é 65, e o valor ASCII para a letra 'a' é 97. Os números 0 a 9 têm os valores ASCII de 48 a 57, respectivamente.&lt;/p&gt;

&lt;p&gt;Para visualizar a tabela completa de caracteres ASCII, você pode consultar a &lt;a href="https://en.wikipedia.org/wiki/ASCII" rel="noopener noreferrer"&gt;tabela ASCII na Wikipedia&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Apesar de ser amplamente utilizado em seus primórdios, o ASCII apresenta limitações ao suportar apenas um conjunto limitado de caracteres, o que torna inviável a representação de idiomas e símbolos de outros alfabetos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Unicode
&lt;/h3&gt;

&lt;p&gt;Para solucionar as limitações do ASCII, o Unicode foi desenvolvido para permitir a representação de um conjunto mais amplo de caracteres, incluindo símbolos, letras e caracteres de idiomas de todo o mundo. O Unicode atribui um número único (chamado de ponto de código) a cada caractere, e atualmente suporta mais de 143.000 pontos de código, permitindo a inclusão de diversos sistemas de escrita, emojis e caracteres especiais.&lt;/p&gt;

&lt;p&gt;A tabela Unicode também inclui os caracteres ASCII originais, tornando-o compatível com sistemas legados.&lt;/p&gt;

&lt;h3&gt;
  
  
  UTF-8 (Unicode Transformation Format - 8 bits)
&lt;/h3&gt;

&lt;p&gt;O UTF-8 é um dos esquemas de codificação mais populares e amplamente utilizados do Unicode. Ele utiliza um número variável de bytes (8 bits) para representar cada caractere, o que permite que os caracteres ASCII sejam representados usando um único byte, mantendo a compatibilidade com sistemas legados que utilizam o ASCII.&lt;/p&gt;

&lt;p&gt;Caracteres não ASCII são representados por um número variável de bytes, dependendo do ponto de código do caractere no Unicode. Isso torna o UTF-8 uma codificação eficiente e econômica para armazenar e transmitir texto multilíngue, uma vez que caracteres menos comuns usam mais bytes, enquanto caracteres mais comuns usam menos.&lt;/p&gt;

&lt;p&gt;Por exemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Caracteres ASCII (0 a 127): Representados em UTF-8 usando 1 byte.&lt;/li&gt;
&lt;li&gt;Caracteres latinos comuns (á, é, í, ó, ú, etc.): Representados em UTF-8 usando 2 bytes.&lt;/li&gt;
&lt;li&gt;Caracteres de outros alfabetos e emojis: Representados em UTF-8 usando 3 ou 4 bytes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O UTF-8 é amplamente recomendado como a codificação padrão para documentos e páginas da web, pois suporta todos os caracteres necessários para uma representação completa e precisa de texto multilíngue.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quebras de Linha, Retorno de Carro e Escape de Caracteres em Strings
&lt;/h3&gt;

&lt;p&gt;Em linguagens de programação, uma string é uma sequência de caracteres. Para representar caracteres especiais, como as quebras de linha e o retorno de carro, dentro de uma string, são utilizados os chamados caracteres de escape. O caractere de escape mais comum é a barra invertida (&lt;code&gt;\&lt;/code&gt;). Quando seguida de um caractere especial, ela indica que o caractere seguinte deve ser tratado de forma especial.&lt;/p&gt;

&lt;p&gt;Por exemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;\n&lt;/code&gt;: Representa uma quebra de linha.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;\r&lt;/code&gt;: Representa um retorno de carro.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;\t&lt;/code&gt;: Representa uma tabulação.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;\"&lt;/code&gt;: Representa uma aspa dupla.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;\'&lt;/code&gt;: Representa uma aspa simples.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;\\&lt;/code&gt;: Representa uma barra invertida.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esses caracteres de escape permitem que você inclua caracteres especiais dentro de uma string, sem que eles sejam interpretados de forma literal.&lt;/p&gt;

&lt;p&gt;Em sistemas Windows, as quebras de linha são representadas pelo par de caracteres &lt;code&gt;\r\n&lt;/code&gt; (retorno de carro seguido de quebra de linha), enquanto em sistemas baseados em Unix (Linux, MacOS), apenas o caractere &lt;code&gt;\n&lt;/code&gt; é utilizado para representar uma quebra de linha.&lt;/p&gt;




&lt;p&gt;Com essa breve revisão, podemos passar para os próximos tópicos desta série e começar a falar sobre linguagens de programação para Desenvolvimento Web, protocolo HTTP e outras coisas mais.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
