Minor corrections to pull request #341 and initial translation of features/gc and features/dtrace (#343)

* Minor corrections to pull request #341

* Initial translation of features/gc and features/dtrace

* Update to language-snippets.ent

* Update to language/errors.xml

* Updates to language/predefined/attributes/*

* Updates to outdated language/predefined/variables/*

* Update to outdated files in install/windows/

* New translation of missing file security/sessions.xml

* New translation of missing files in language/context

* Update datetime.xml

* New translation of missing files in datetime/

---------

Co-authored-by: LEONARDO LARA RODRIGUES <leonardolara@github.com>
This commit is contained in:
Leonardo Lara Rodrigues
2023-11-13 14:14:06 -03:00
committed by GitHub
parent 69ef6d8f26
commit 909023c945
50 changed files with 3760 additions and 66 deletions

558
features/dtrace.xml Normal file
View File

@@ -0,0 +1,558 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 9e2d8231b5d8a3795b365c6770fab288e59e6249 Maintainer: _ Status: ready --><!-- CREDITS: leonardolara -->
<chapter xml:id="features.dtrace" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Instrumentação dimâmica DTrace</title>
<sect1 xml:id="features.dtrace.introduction">
<title>Introdução ao PHP e DTrace</title>
<para>
DTrace é um framework de instrumentação com alta disponibilidade e pequena sobrecarga,
disponível em um número de plataformas incluindo Solaris, macOS,
Oracle Linux e BSD. DTrace pode instrumentar comportamento do sistema operacional
e execução de programa de usuário. Ele pode exibir valores de argumentos e ser
usado para inferir estatísticas de desempenho. Os sensores são monitorados pos scripts
criados pelo usuário escritos na linguagem própria do DTrace (D). Isto
permite uma análise eficiente de pontos de dados.
</para>
<para>
Sensores PHP que não estão monitorados ativamente por um script
D do usuário não contêm código instrumentado, então não há
degradação de desempenho durante a execução normal da aplicação.
Sensores que estão sendo monitorados incorrem em uma sobrecarga pequena o suficiente
para permitir monitoramento pelo DTrace em sistemas ativos em fase de produção.
</para>
<para>
PHP incorpora sensores com "Instrumentação Estaticamente Definida no Nível de Usuário" (USDT em inglês)
que são ativados em tempo de execução. Por exemplo, quando um script D
está monitorando o sensor de <literal>entrada de função</literal> do PHP, então
a cada momento que uma função do PHP é chamada, este sensor é disparado e
o código de ação do script D associado é executado. Este código de ação
poderia, por exemplo, imprimir argumentos de sensor como a localização do arquivo-fonte
da função PHP. Ou a ação poderia agregar dados como
o númedo de vezes que cada função é chamada.
</para>
<para>
Apenas os sensores USDT do PHP são descritas aqui. Refira-se à literatura externa do Dtrace,
tanto geral quanto específica do sistema operacional, para entender como
o DTrace pode ser usado para instrumentar funções arbitrárias, e como ele pode ser
usado para instrumentar comportamento do sistema operacional. Note que nem todas as
características do DTrace estão disponíveis em todas as implementações.
</para>
<para>
Os sensores estáticos do Dtrace no PHP podem alternativamente ser utilizados com a
ferramenta SystemTap de algumas distribuições Linux.
</para>
</sect1>
<sect1 xml:id="features.dtrace.dtrace">
<title>Usando PHP e DTrace</title>
<para>
O PHP pode ser configuracom com sensores estáticos do DTrace em plataformas que
suportam a Instrumentação Dinâmica do DTrace.
</para>
<sect2 xml:id="features.dtrace.install">
<title>Configurando o PHP para Sensores Estáticos DTrace</title>
<para>
Refira-se à documentação externa específica da plataforma para habilitar
o suporte do DTrace no sistema operacional. Por exemplo, no Oracle Linux
inicialize um kernel UEK3 e rode os seguintes comandos:
<informalexample>
<programlisting role="php">
<![CDATA[
# modprobe fasttrap
# chmod 666 /dev/dtrace/helper
]]>
</programlisting>
</informalexample>
</para>
<para>
Ao invés de usar <literal>chmod</literal>, pode-se alternativamente usar uma
regra de pacote ACL para limitar o acesso a um dispositivo para um usuário específico.
</para>
<para>
Construa o PHP com o parâmetro de configuração <literal>--enable-dtrace</literal>:
<informalexample>
<programlisting role="php">
<![CDATA[
# ./configure --enable-dtrace ...
# make
# make install
]]>
</programlisting>
</informalexample>
</para>
<para>
Isto habilita sensores estáticos no núcleo do PHP. Quaisquer extensões PHP
que fornecem seus próprios sensores devem ser construídas separadamente como
extensões compartilhadas.
</para>
</sect2>
<sect2 xml:id="features.dtrace.static-probes">
<title>Sensores Estáticos DTrace no Núcleo do PHP</title>
<table>
<title>Os sensores estáticos a seguir estão disponíveis no PHP</title>
<tgroup cols="2">
<thead>
<row>
<entry>Nome do Sensor</entry>
<entry>Descrição do Sensor</entry>
<entry>Argumentos do Sensor</entry>
</row>
</thead>
<tbody>
<row>
<entry><literal>request-startup</literal></entry>
<entry>Dispara quando uma requisição inicia.</entry>
<entry>char *<varname>file</varname>, char *<varname>request_uri</varname>, char *<varname>request_method</varname></entry>
</row>
<row>
<entry><literal>request-shutdown</literal></entry>
<entry>Dispara quando uma requisição termina.</entry>
<entry>char *<varname>file</varname>, char *<varname>request_uri</varname>, char *<varname>request_method</varname></entry>
</row>
<row>
<entry><literal>compile-file-entry</literal></entry>
<entry>Dispara quando a compilação de um script inicia.</entry>
<entry>char *<varname>compile_file</varname>, char *<varname>compile_file_translated</varname></entry>
</row>
<row>
<entry><literal>compile-file-return</literal></entry>
<entry>Dispara quando a compilação de um script termina.</entry>
<entry>char *<varname>compile_file</varname>, char *<varname>compile_file_translated</varname></entry>
</row>
<row>
<entry><literal>execute-entry</literal></entry>
<entry>Dispara quando um array de opcode está para ser executado. Por
exemplo, ele dispara em chamadas de função, de includes e em continuação
de geradores.</entry>
<entry>char *<varname>request_file</varname>, int <varname>lineno</varname></entry>
</row>
<row>
<entry><literal>execute-return</literal></entry>
<entry>Dispara depois da execução de um array de opcode.</entry>
<entry>char *<varname>request_file</varname>, int <varname>lineno</varname></entry>
</row>
<row>
<entry><literal>function-entry</literal></entry>
<entry>Dispara quando o motor do PHP entra em uma chamada de função ou método.</entry>
<entry>char *<varname>function_name</varname>, char *<varname>request_file</varname>, int <varname>lineno</varname>, char *<varname>classname</varname>, char *<varname>scope</varname></entry>
</row>
<row>
<entry><literal>function-return</literal></entry>
<entry>Dispara quando o motor do PHP retorna de uma chamada de função ou método.</entry>
<entry>char *<varname>function_name</varname>, char *<varname>request_file</varname>, int <varname>lineno</varname>, char *<varname>classname</varname>, char *<varname>scope</varname></entry>
</row>
<row>
<entry><literal>exception-thrown</literal></entry>
<entry>Dispara quando uma exceção é disparada.</entry>
<entry>char *<varname>classname</varname></entry>
</row>
<row>
<entry><literal>exception-caught</literal></entry>
<entry>Dispara quando uma exceção é capturada.</entry>
<entry>char *<varname>classname</varname></entry>
</row>
<row>
<entry><literal>error</literal></entry>
<entry>Dispara quando um erro ocorre, independente do nível de <link linkend="ini.error-reporting">error_reporting</link>.</entry>
<entry>char *<varname>errormsg</varname>, char *<varname>request_file</varname>, int <varname>lineno</varname></entry>
</row>
</tbody>
</tgroup>
</table>
<para>
Extensões de PHP podem também conter sensores estáticos adicionais.
</para>
</sect2>
<sect2 xml:id="features.dtrace.list-probes">
<title>Listando os Sensores Estáticos DTrace no PHP</title>
<para>
Para listar os sensores disponíveis, inicie um processo PHP e então execute:
<informalexample>
<programlisting>
<![CDATA[
# dtrace -l
]]>
</programlisting>
</informalexample>
</para>
<para>
A saída será similar a:
<informalexample>
<programlisting>
<![CDATA[
ID PROVIDER MODULE FUNCTION NAME
[ . . . ]
4 php15271 php dtrace_compile_file compile-file-entry
5 php15271 php dtrace_compile_file compile-file-return
6 php15271 php zend_error error
7 php15271 php ZEND_CATCH_SPEC_CONST_CV_HANDLER exception-caught
8 php15271 php zend_throw_exception_internal exception-thrown
9 php15271 php dtrace_execute_ex execute-entry
10 php15271 php dtrace_execute_internal execute-entry
11 php15271 php dtrace_execute_ex execute-return
12 php15271 php dtrace_execute_internal execute-return
13 php15271 php dtrace_execute_ex function-entry
14 php15271 php dtrace_execute_ex function-return
15 php15271 php php_request_shutdown request-shutdown
16 php15271 php php_request_startup request-startup
]]>
</programlisting>
</informalexample>
</para>
<para>
Os valores da coluna Provider consistem de <literal>php</literal> mais o id
do processo PHP sendo executado.
</para>
<para>
Se o servidor web Apache estiver rodando, o módulo poderia ser, por
exemplo, <filename>libphp5.so</filename>, e haveria
múltiplos blocos de listagens, um para cada processo Apache em execução.
</para>
<para>
A coluna Function refere-se aos nomes das funções da implementação
interna do PHP, em C, onde cada fornecedor está localizado.
</para>
<para>
Se um processo PHP não estiver em execução, então nenhum sensor PHP será mostrado.
</para>
</sect2>
<sect2 xml:id="features.dtrace.examples">
<title>Exemplo de DTrace com PHP</title>
<para>
Este exemplo mostra o básico da linguagem D de scripts DTrace.
<example>
<title>Arquivo <filename>all_probes.d</filename> para instrumentar todos os Sensores Estáticos PHP com DTrace</title>
<programlisting>
<![CDATA[
#!/usr/sbin/dtrace -Zs
#pragma D option quiet
php*:::compile-file-entry
{
printf("PHP compile-file-entry\n");
printf(" compile_file %s\n", copyinstr(arg0));
printf(" compile_file_translated %s\n", copyinstr(arg1));
}
php*:::compile-file-return
{
printf("PHP compile-file-return\n");
printf(" compile_file %s\n", copyinstr(arg0));
printf(" compile_file_translated %s\n", copyinstr(arg1));
}
php*:::error
{
printf("PHP error\n");
printf(" errormsg %s\n", copyinstr(arg0));
printf(" request_file %s\n", copyinstr(arg1));
printf(" lineno %d\n", (int)arg2);
}
php*:::exception-caught
{
printf("PHP exception-caught\n");
printf(" classname %s\n", copyinstr(arg0));
}
php*:::exception-thrown
{
printf("PHP exception-thrown\n");
printf(" classname %s\n", copyinstr(arg0));
}
php*:::execute-entry
{
printf("PHP execute-entry\n");
printf(" request_file %s\n", copyinstr(arg0));
printf(" lineno %d\n", (int)arg1);
}
php*:::execute-return
{
printf("PHP execute-return\n");
printf(" request_file %s\n", copyinstr(arg0));
printf(" lineno %d\n", (int)arg1);
}
php*:::function-entry
{
printf("PHP function-entry\n");
printf(" function_name %s\n", copyinstr(arg0));
printf(" request_file %s\n", copyinstr(arg1));
printf(" lineno %d\n", (int)arg2);
printf(" classname %s\n", copyinstr(arg3));
printf(" scope %s\n", copyinstr(arg4));
}
php*:::function-return
{
printf("PHP function-return\n");
printf(" function_name %s\n", copyinstr(arg0));
printf(" request_file %s\n", copyinstr(arg1));
printf(" lineno %d\n", (int)arg2);
printf(" classname %s\n", copyinstr(arg3));
printf(" scope %s\n", copyinstr(arg4));
}
php*:::request-shutdown
{
printf("PHP request-shutdown\n");
printf(" file %s\n", copyinstr(arg0));
printf(" request_uri %s\n", copyinstr(arg1));
printf(" request_method %s\n", copyinstr(arg2));
}
php*:::request-startup
{
printf("PHP request-startup\n");
printf(" file %s\n", copyinstr(arg0));
printf(" request_uri %s\n", copyinstr(arg1));
printf(" request_method %s\n", copyinstr(arg2));
}
]]>
</programlisting>
</example>
</para>
<para>
Este script usa a opção <literal>-Z</literal> para a aplicação
<filename>dtrace</filename>, permitindo que ela seja executada quando não
há processo PHP em execução. Se esta opção fosse omitida, o script
iria terminar imediatamente porque ele saberia que nenhum dos sensores
a serem monitorados existiriam.
</para>
<para>
O script instrumenta todos os pontos de sensores estáticos do núcleo do PHP durante toda a
duração de um script PHP em execução. Execute o script D:
<informalexample>
<programlisting>
<![CDATA[
# ./all_probes.d
]]>
</programlisting>
</informalexample>
</para>
<para>
Executa um script PHP ou aplicação. O script D de monitoramento terá
como saída os argumentos de cada um dos sensores quando for disparado.
</para>
<para>
Quando o monitoramento estiver completo, o script D pode ser terminado com
<keycombo action='simul'><keycap>CTRL</keycap><keycap>C</keycap></keycombo>.
</para>
<para>
Em máquinas com múltiplas CPUs, pode parecer que os sensor estão em ordem
não sequencial. Isto depende de qual CPU está processando os sensores,
e como as threads migram atráves dos CPUs. Mostrar os timestamps dos sensores
irá ajudar a reduzir a confusão, por exemplo:
<informalexample>
<programlisting>
<![CDATA[
php*:::function-entry
{
printf("%lld: PHP function-entry ", walltimestamp);
[ . . .]
}
]]>
</programlisting>
</informalexample>
</para>
</sect2>
<sect2 xml:id="features.dtrace.references">
&reftitle.seealso;
<simplelist>
<member><link linkend="oci8.dtrace">Instrumentação Dinâmica OCI8 e DTrace</link></member>
</simplelist>
</sect2>
</sect1>
<sect1 xml:id="features.dtrace.systemtap">
<title>Usando SystemTap com Sensores Estáticos DTrace</title>
<para>
Em algumas distribuições Linux, o utilitário SystemTap de instrumentação pode ser
usado para instrumentar sensores estáticos do PHP. Isso está disponível no
PHP 5.4.20 e PHP 5.5.
</para>
<sect2 xml:id="features.dtrace.systemtap-install">
<title>Instalando PHP com SystemTap</title>
<para>
Instale o pacote de desenvolvimento do SystemTap, SDT:
<informalexample>
<programlisting role="shell">
<![CDATA[
# yum install systemtap-sdt-devel
]]>
</programlisting>
</informalexample>
</para>
<para>
Instale o PHP com os sensores DTrace habilitados:
<informalexample>
<programlisting role="shell">
<![CDATA[
# ./configure --enable-dtrace ...
# make
]]>
</programlisting>
</informalexample>
</para>
</sect2>
<sect2 xml:id="features.dtrace.systemtap-list-probes">
<title>Listando os Sensores Estáticos com SystemTap</title>
<para>
Os sensores estáticos em PHP podem ser listados usando <filename>stap</filename>:
<informalexample>
<programlisting>
<![CDATA[
# stap -l 'process.provider("php").mark("*")' -c 'sapi/cli/php -i'
]]>
</programlisting>
</informalexample>
</para>
<para>
A saída será:
<informalexample>
<programlisting>
<![CDATA[
process("sapi/cli/php").provider("php").mark("compile__file__entry")
process("sapi/cli/php").provider("php").mark("compile__file__return")
process("sapi/cli/php").provider("php").mark("error")
process("sapi/cli/php").provider("php").mark("exception__caught")
process("sapi/cli/php").provider("php").mark("exception__thrown")
process("sapi/cli/php").provider("php").mark("execute__entry")
process("sapi/cli/php").provider("php").mark("execute__return")
process("sapi/cli/php").provider("php").mark("function__entry")
process("sapi/cli/php").provider("php").mark("function__return")
process("sapi/cli/php").provider("php").mark("request__shutdown")
process("sapi/cli/php").provider("php").mark("request__startup")
]]>
</programlisting>
</informalexample>
</para>
</sect2>
<sect2 xml:id="features.dtrace.systemtap-examples">
<title>Exemplo de SystemTap com PHP</title>
<para>
<example>
<title><filename>all_probes.stp</filename> para instrumentação de todos os Sensores Estáticos do PHP com SystemTap</title>
<programlisting role="shell">
<![CDATA[
probe process("sapi/cli/php").provider("php").mark("compile__file__entry") {
printf("Probe compile__file__entry\n");
printf(" compile_file %s\n", user_string($arg1));
printf(" compile_file_translated %s\n", user_string($arg2));
}
probe process("sapi/cli/php").provider("php").mark("compile__file__return") {
printf("Probe compile__file__return\n");
printf(" compile_file %s\n", user_string($arg1));
printf(" compile_file_translated %s\n", user_string($arg2));
}
probe process("sapi/cli/php").provider("php").mark("error") {
printf("Probe error\n");
printf(" errormsg %s\n", user_string($arg1));
printf(" request_file %s\n", user_string($arg2));
printf(" lineno %d\n", $arg3);
}
probe process("sapi/cli/php").provider("php").mark("exception__caught") {
printf("Probe exception__caught\n");
printf(" classname %s\n", user_string($arg1));
}
probe process("sapi/cli/php").provider("php").mark("exception__thrown") {
printf("Probe exception__thrown\n");
printf(" classname %s\n", user_string($arg1));
}
probe process("sapi/cli/php").provider("php").mark("execute__entry") {
printf("Probe execute__entry\n");
printf(" request_file %s\n", user_string($arg1));
printf(" lineno %d\n", $arg2);
}
probe process("sapi/cli/php").provider("php").mark("execute__return") {
printf("Probe execute__return\n");
printf(" request_file %s\n", user_string($arg1));
printf(" lineno %d\n", $arg2);
}
probe process("sapi/cli/php").provider("php").mark("function__entry") {
printf("Probe function__entry\n");
printf(" function_name %s\n", user_string($arg1));
printf(" request_file %s\n", user_string($arg2));
printf(" lineno %d\n", $arg3);
printf(" classname %s\n", user_string($arg4));
printf(" scope %s\n", user_string($arg5));
}
probe process("sapi/cli/php").provider("php").mark("function__return") {
printf("Probe function__return: %s\n", user_string($arg1));
printf(" function_name %s\n", user_string($arg1));
printf(" request_file %s\n", user_string($arg2));
printf(" lineno %d\n", $arg3);
printf(" classname %s\n", user_string($arg4));
printf(" scope %s\n", user_string($arg5));
}
probe process("sapi/cli/php").provider("php").mark("request__shutdown") {
printf("Probe request__shutdown\n");
printf(" file %s\n", user_string($arg1));
printf(" request_uri %s\n", user_string($arg2));
printf(" request_method %s\n", user_string($arg3));
}
probe process("sapi/cli/php").provider("php").mark("request__startup") {
printf("Probe request__startup\n");
printf(" file %s\n", user_string($arg1));
printf(" request_uri %s\n", user_string($arg2));
printf(" request_method %s\n", user_string($arg3));
}
]]>
</programlisting>
</example>
</para>
<para>
O script acima irá instrumentar todos os pontos de sensores estáticos do núcleo do PHP
durante toda a duração de um script PHP em execução:
<informalexample>
<programlisting>
<![CDATA[
# stap -c 'sapi/cli/php test.php' all_probes.stp
]]>
</programlisting>
</informalexample>
</para>
</sect2>
</sect1>
</chapter>
<!-- Keep this comment at the end of the file
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->

690
features/gc.xml Normal file
View File

@@ -0,0 +1,690 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 9957fc259b7b920269ead2a0180969db5bf13433 Maintainer: _ Status: ready --><!-- CREDITS: leonardolara -->
<chapter xml:id="features.gc" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Garbage Collection</title>
<para>
Esta seção explica os méritos do novo mecanismo do Coletor de Lixo (também conhecido
como GC - Garbage Collector) que é parte do PHP 5.3.
</para>
<sect1 xml:id="features.gc.refcounting-basics">
<title>Básico sobre Contagem de Referência</title>
<para>
Uma variável PHP é armazenada em um contêiner chamado "zval". Um zval
contém, além do tipo e do valor da variável, dois bits adicionais de
informação. O primeiro é chamado de "is_ref" e é um valor booleano
que indica se a variável é parte de um "conjunto de referência" ou não. Com
este bit, o motor do PHP sabe como diferenciar entre variáveis normais
e referências. Como o PHP permite referências no nível do usuário, como as criadas pelo
operador &amp; um contêiner zval também tem um mecanismo de contagem de referência
interno para otimizar o uso de memória. Esta segunda parte de informação
adicional, chamado "refcount", contém a quantidade de nomes de variáveis (também
chamadas de símbolos) que apontam para este contêiner. Todos os símbolos são armazenados em
uma tabela de símbolos, e existe uma por escopo. Existe um escopo para o
script principal (ou seja, aquele requisitado através do navegador), assim como um escopo
para cada função ou método.
</para>
<para>
Um contêiner zval é criado quando uma nova variável é criada com um valor
constante, como em:
<example>
<title>Criando um novo contêiner zval</title>
<programlisting role="php">
<![CDATA[
<?php
$a = "new string";
?>
]]>
</programlisting>
</example>
</para>
<para>
Neste caso, o nome do símbolo, <literal>a</literal>, é criado no escopo atual,
e um novo contêiner de variável é criado com o tipo <type>string</type> e o valor
<literal>new string</literal>. O bit "is_ref" é por padrão definido para &false; porque nenhuma
referência no nível do usuário foi criada. O "refcount" é definidois para <literal>1</literal>
que existe apenas um símbolo que faz uso deste contêiner de variável. Note
que referências (isto é, "is_ref" igual a &true;) com "refcount" igual a <literal>1</literal>, são
tratadas como se elas não fossem referências (como se "is_ref" fosse &false;). Se o <link
xlink:href="&url.xdebug;">Xdebug</link> estiver instalado, esta informação pode ser
mostrada chamando-se a função <function>xdebug_debug_zval</function>.
</para>
<para>
<example>
<title>Mostrando a informação zval</title>
<programlisting role="php">
<![CDATA[
<?php
$a = "new string";
xdebug_debug_zval('a');
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
a: (refcount=1, is_ref=0)='new string'
]]>
</screen>
</example>
</para>
<para>
Atribuindo esta variável a outro nome de variável irá aumentar o "refcount".
</para>
<para>
<example>
<title>Aumentando o "refcount" de um zval</title>
<programlisting role="php">
<![CDATA[
<?php
$a = "new string";
$b = $a;
xdebug_debug_zval( 'a' );
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
a: (refcount=2, is_ref=0)='new string'
]]>
</screen>
</example>
</para>
<para>
O refcount é <literal>2</literal> aqui, porque o mesmo contêiner de variável está ligado
tanto com <varname>a</varname> quanto com <varname>b</varname>.
O PHP é inteligente o suficiente para não copiar o contêiner real da
variável quando não for necessário. Contêineres são destruídos quando
o "refcount" atinge zero. O "refcount" é diminuído em uma unidade quando qualquer
símbolo ligado ao contêiner da variável deixa o escopo (ex.: quando a
função termina) ou quanto um símbolo perde a atribuição (ex.: chamando <function>unset</function>).
O exemplo a seguir mostra isso:
</para>
<para>
<example>
<title>Diminuindo o "refcount" de zval</title>
<programlisting role="php">
<![CDATA[
<?php
$a = "new string";
$c = $b = $a;
xdebug_debug_zval( 'a' );
$b = 42;
xdebug_debug_zval( 'a' );
unset( $c );
xdebug_debug_zval( 'a' );
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
a: (refcount=3, is_ref=0)='new string'
a: (refcount=2, is_ref=0)='new string'
a: (refcount=1, is_ref=0)='new string'
]]>
</screen>
</example>
</para>
<para>
Se agora <literal>unset($a);</literal> for chamada, o contêiner da variável, incluindo o tipo
e o valor, serão removidos da memória.
</para>
<sect2 xml:id="features.gc.compound-types">
<title>Tipos Compostos</title>
<para>
As coisas ficam um pouco mais complexas com tipos compostos como <type>array</type>s e
<type>objeto</type>s. Ao contrário dos valores <type>escalar</type>es, <type>array</type>s
e <type>objeto</type>s armazenam suas
propriedades em uma tabela de símbolos própria. Isto significa que o exemplo
a seguir cria três contêineres zval:
</para>
<para>
<example>
<title>Criando um zval de <type>array</type></title>
<programlisting role="php">
<![CDATA[
<?php
$a = array( 'meaning' => 'life', 'number' => 42 );
xdebug_debug_zval( 'a' );
?>
]]>
</programlisting>
&example.outputs.similar;
<screen>
<![CDATA[
a: (refcount=1, is_ref=0)=array (
'meaning' => (refcount=1, is_ref=0)='life',
'number' => (refcount=1, is_ref=0)=42
)
]]>
</screen>
<para>Ou graficamenet</para>
<mediaobject>
<alt>Zvals para um array simples</alt>
<imageobject>
<imagedata fileref="en/features/figures/simple-array.png" format="PNG"/>
</imageobject>
</mediaobject>
</example>
</para>
<para>
Os três contêineres zval são: <varname>a</varname>, <varname>meaning</varname>, e <varname>number</varname>.
Regras similares se aplicam para aumento e redução de "refcounts". Abaixo, outro elemento é
adicionado ao array, e define seu valor ao conteúdo de um elemento
já existente:
</para>
<para>
<example>
<title>Adicionando elemento já existente a um array</title>
<programlisting role="php">
<![CDATA[
<?php
$a = array( 'meaning' => 'life', 'number' => 42 );
$a['life'] = $a['meaning'];
xdebug_debug_zval( 'a' );
?>
]]>
</programlisting>
&example.outputs.similar;
<screen>
<![CDATA[
a: (refcount=1, is_ref=0)=array (
'meaning' => (refcount=2, is_ref=0)='life',
'number' => (refcount=1, is_ref=0)=42,
'life' => (refcount=2, is_ref=0)='life'
)
]]>
</screen>
<para>Ou graficamente</para>
<mediaobject>
<alt>Zvals para um array simples com uma referência</alt>
<imageobject>
<imagedata fileref="en/features/figures/simple-array2.png" format="PNG"/>
</imageobject>
</mediaobject>
</example>
</para>
<para>
Pela saída do Xdebug acima, pode-se perceber que tanto o elemento antigo do array
quanto o novo agora apontam para um contêiner zval cujo "refcount" é
<literal>2</literal>. Embora a saída do Xdebug mostre dois contêineres zval
com valor <literal>'life'</literal>, eles são o mesmo. A função
<function>xdebug_debug_zval</function> não mostra isso, mas
pode-se ver isso mostrando o ponteiro de memória.
</para>
<para>
Remover o elemento de um array é como remover um símbolo de um escopo.
Fazendo isso, o "refcount" de um contêiner ao qual um elemento do array aponta
é reduzido. Novamente, quando o "refcount" atinge zero, o contêiner da
variável é removido da memória. Um exemplo para mostrar isto:
</para>
<para>
<example>
<title>Removendo um elemento de um array</title>
<programlisting role="php">
<![CDATA[
<?php
$a = array( 'meaning' => 'life', 'number' => 42 );
$a['life'] = $a['meaning'];
unset( $a['meaning'], $a['number'] );
xdebug_debug_zval( 'a' );
?>
]]>
</programlisting>
&example.outputs.similar;
<screen>
<![CDATA[
a: (refcount=1, is_ref=0)=array (
'life' => (refcount=1, is_ref=0)='life'
)
]]>
</screen>
</example>
</para>
<para>
Agora, as coisas ficam interessantes se o próprio array for adicionado como
um elemento do array, o que é mostrado no exemplo a seguir, onde também um operador
de referência foi inserido, senão o PHP criaria uma cópia:
</para>
<para>
<example>
<title>Adicionando o próprio array como um elemento de si mesmo</title>
<programlisting role="php">
<![CDATA[
<?php
$a = array( 'one' );
$a[] =& $a;
xdebug_debug_zval( 'a' );
?>
]]>
</programlisting>
&example.outputs.similar;
<screen>
<![CDATA[
a: (refcount=2, is_ref=1)=array (
0 => (refcount=1, is_ref=0)='one',
1 => (refcount=2, is_ref=1)=...
)
]]>
</screen>
<para>Ou graficamente</para>
<mediaobject>
<alt>Zvals para um array com referência circular</alt>
<imageobject>
<imagedata fileref="en/features/figures/loop-array.png" format="PNG"/>
</imageobject>
</mediaobject>
</example>
</para>
<para>
Pode-se perceber que a variável do array (<varname>a</varname>) assim como o segundo elemento
(<varname>1</varname>) agora apontam para um contêiner de veriável que tem um "refcount" de <literal>2</literal>.
Os "..." no exemplo acima mostram que há recursão envolvida, e que,
obviamente, neste caso significa que os "..." apontam de volta ao
array original.
</para>
<para>
Como antes, tirar a atribuição de uma variável remove o símbolo, e a
contagem de referência do contêiner da variável à qual o símbolo aponta é reduzida em uma
unidade. Então, se a variável <varname>$a</varname> perder a atribuição após execução do código acima,
a contagem de referência do contêiner da variável à qual <varname>$a</varname> e o elemento "1" apontam
será diminuída em uma unidade, de "2" para "1". Isto pode ser representado assim:
</para>
<para>
<example>
<title>Removendo a atribuição de <varname>$a</varname></title>
<screen>
<![CDATA[
(refcount=1, is_ref=1)=array (
0 => (refcount=1, is_ref=0)='one',
1 => (refcount=1, is_ref=1)=...
)
]]>
</screen>
<para>Ou graficamente</para>
<mediaobject>
<alt>Zvals depois da remoção do array com um referência circular demonstrando o vazamento de memória</alt>
<imageobject>
<imagedata fileref="en/features/figures/leak-array.png" format="PNG"/>
</imageobject>
</mediaobject>
</example>
</para>
</sect2>
<sect2 xml:id="features.gc.cleanup-problems">
<title>Problemas na Limpeza</title>
<para>
Embora não haja mais um símbolo em nenhum escopo apontando para esta
estrutura, ela não pode ser limpa porque o elemento "1" do array ainda
aponta para este mesmo array. Como não há símbolo externo apontando para
ela, não há como um usuário limpar esta estrutura; e aí acontece o
vazamento de memória. Felizmente, o PHP irá limpar esta estrutura de dados no final
da requisição, mas até lá, ela irá ocupar um espaço valioso na
memória. Esta situação ocorre frequentemente quando se está implementando algoritmos
de interpretação ou outros onde existe um elemento "filho" apontando de volta para um
elemento "pai". A mesma situação também pode com certeza ocorrer com objetos, onde
na verdade existe mais probabilidade de ocorrer, já que objetos são sempre implicitamente
usados por referência.
</para>
<para>
Isso pode não ser um problema quanto acontecer somente uma ou duas vezes, mas se
houver milhares, ou até milhões dessas perdas de memória, obviamente
começa a ser um problema. É especialmente problemático em scripts de execução
longa, como daemons onde a requisição basicamente nunca termina,
ou em grande conjuntos de testes de unidades. Este último já causou problemas durante
a execução de testes de unidades para o componente Template da bilioteca eZ
Components. Em alguns casos, era necessário mais de 2GB de memória, que o servidor
de testes não tinha.
</para>
</sect2>
</sect1>
<sect1 xml:id="features.gc.collecting-cycles">
<title>Ciclos de Coleta</title>
<para>
Tradicionalmente, mecanismos de memória de contagem de referência, como os
usados anteriormente pelo PHP, falham ao lidar com vazamentos de memória de referência circular;
entretanto, desde a versão 5.3.0, o PHP implementa o algoritmo síncrono do artigo
<link xlink:href="&url.gc-paper;">Concurrent Cycle Collection in Reference Counted Systems</link>
que lida com este problema.
</para>
<para>
Uma explicação completa de como o algoritmo funciona estaria um pouco além do
escopo desta seção, mas o básico é explicado aqui. Primeiramente,
deve-se estabelecer algumas regras gerais. Se um "refcount" é incrementado, ele
ainda está em uso e, portanto, não é lixo. Se o refcount é reduzido e
alcança zero, o zval pode ser liberado. Isso significa que os ciclos de coleta
somente podem ser criados quando um argumento "refcount" é reduzido para um valor diferente de zero.
Adicionalmente, em um ciclo de coleta, é possível descobrir quais partes são lixo,
verificando se é possível reduzir seus "refcounts" em uma unidade,
e então observando quais dos zvals têm um "refcount" diferente de zero.
</para>
<para>
<mediaobject>
<alt>Algoritmo de coleta de lixo</alt>
<imageobject>
<imagedata fileref="en/features/figures/gc-algorithm.png" format="PNG"/>
</imageobject>
</mediaobject>
</para>
<para>
Para evitar chamadas de verificação de ciclos de coleta com qualquer
redução possível de um refcount, o algoritmo em vez disso coloca todas as
raízes (zvals) possíveis no "buffer de raízes" (tornando-os "roxos"). Ele também
certifica que cada raiz possível chegue ao buffer apenas uma vez. Apenas quando
o buffer de raízes está cheio é que o mecanismo de coleta se inicia para todos
os diferentes zvals contidos. Veja o passo A na figura acima.
</para>
<para>
No passo B, o algoritmo executa uma pesquisa em profundidade em todas as raízes possíveis
para reduzir em um os refcounts de cada zval que ele encontra, certificando-se de não
reduzir um refcount no mesmo zval duas vezes (marcando-os de "cinza"). No
passo C, o algoritmo novamente executa uma pesquisa em profundidade a partir de cada nó de raiz,
para verificar o refcount de cada zval de novo. Se ele encontra o valor zero,
o zval é marcado de "branco" (azul na figura). Se ele for maior que
zero, ele reverte a redução do refcount em uma unidade com uma pesquisa em
profundidade daquele ponto em diante, e eles são marcados de "preto" novamente. No último
passo (D), o algoritmo percorre o buffer de raízes removendo as raízes de zval
de lá e, ao mesmo tempo, verifica quais zvals foram marcados de "branco" no
passo anterior. Cada zval marcado de "branco" será liberado da memória.
</para>
<para>
Agora que há um entendimento básico de como o algoritmo funciona, vejamos
como isto se integra com o PHP. Por padrão, o coletor de lixo do
PHP fica habilitado. Existe, porém uma configuração
do &php.ini; que permite mudar isso:
<link linkend="ini.zend.enable-gc">zend.enable_gc</link>.
</para>
<para>
Quando o coletor de lixo é habilitado, o algoritmo de pesquisa de ciclos como
descrito acima é executado toda vez que o buffer ficar cheio. O buffer
de raízes tem um tamanho fixo de 10.000 raízes possíveis (embora isso possa ser
alterado mudando-se a constante <constant>GC_THRESHOLD_DEFAULT</constant> em
<literal>Zend/zend_gc.c</literal> no código-fonte do PHP, e recompilando-o).
Quando o coletor de lixo é desabilitado, o algoritmo de pesquisa
de ciclos nunca será executado. Entretando, possíveis raízes serão sempre registradas
no buffer de raízes, não importando se o mecanismo de coleta de lixo tenha
sido ou não habilitado com esta configuração.
</para>
<para>
Se o buffer de raízes ficar cheio de raízes possíveis enquanto o mecanismo de
coleta de lixo está desabilitado, as possíveis raízes adicionais simplesmente
não serão registradas. Essas raízes não registradas nunca serão
analisadas pelo algoritmo. Se eles fossem parte de um ciclo de referência
circular, eles nunca seriam limpados e iriam criar um vazamento de memória.
</para>
<para>
O motivo pelo qual as raízes possíveis são registradas mesmo se o mecanismo
for desabilitado é poque é mais rápido registrar raízes possíveis do que ter que
verificar se o mecanismo está ligado toda vez que uma raiz possível puder
ser encontrada. O próprio mecanismo de coleta e análise de lixo, no entanto,
pode levar um tempo considerável.
</para>
<para>
Além de mudar a configuração <link linkend="ini.zend.enable-gc">zend.enable_gc</link>,
também é possível habilitar e desabilitar o mecanismo de coleta de lixo
chamando-se <function>gc_enable</function> ou
<function>gc_disable</function> respectivamente. Chamar estas funções tem
o mesmo efeito de ligar ou desligar o mecanismo com a configuração.
Também é possível forçar a coleta de ciclos mesmo se o
buffer de raízes possíveis não estiver cheio. Para isto, pode-se usar
a função <function>gc_collect_cycles</function>. Esta função retornará
quantos ciclos foram coletados pelo algoritmo.
</para>
<para>
A razão por trás da possibilidade do prório usuário ligar e desligar o mecanismo, e
iniciar a coleta de ciclos, é que algumas partes de aplicações podem ser
altamente sensíveis a tempo de execução. Nesses casos, pode não ser desejado que
o mecanismo de coleta inicie. Obviamente, desligando-se o coletor
de lixo para certas partes de uma aplicação cria o risco
de gerar vazamentos de memória porque algumas raízes possíveis podem não
caber no buffer limitado. Portanto, provavelmente é mais sábio chamar
a função <function>gc_collect_cycles</function> logo antes de chamar
a função <function>gc_disable</function> para liberar a memória que poderia ser perdida
através de raízes possíveis que estariam já registradas no buffer. Isso
então leva a um buffer vazio para que haja mais espaço para armazenar
raízes possíveis enquanto o mecanismo de ciclos de coleta está desligado.
</para>
</sect1>
<sect1 xml:id="features.gc.performance-considerations">
<title>Considerações de Desempenho</title>
<para>
Já foi mencionado na seção anterior que simplesmente coletar as
raízes possíveis tme um impacto muito pequeno em desempenho, mas isso quando
compara-se o PHP 5.2 com o PHP 5.3. Embora o registro de raízes possíveis
comparado ao não registro, como no PHP 5.2, seja mais lento, outras
mudanção em tempo de execução no PHP 5.3 evitam que esta perda particular
de desempenho apareça.
</para>
<para>
Existem duas grandes áreas onde o desempenho é afetado. A primeira
é o uso reduzido de memória, e a segunda é o atraso em tempo de execução
quando o mecanismo de coleta de lixo faz suas limpezas de memória. Estes
dois problemas serão mostrados a seguir.
</para>
<sect2 xml:id="features.gc.performance-considerations.reduced-mem">
<title>Uso Reduzido de Memória</title>
<para>
Primeiramente, o grande motivo pelo qual o mecanismo de coleta de lixo
existe é para reduzir o uso de memória através de limpeza de variáveis
em referência circular assim que os pré-requisitos são preenchidos. Na
implementação do PHP, isso acontece assim que o buffer de raízes fica cheio, ou
quando a função <function>gc_collect_cycles</function> é chamada. No
gráfico abaixo, é mostrado o uso de memória do script a seguir,
tanto no PHP 5.2 quanto no PHP 5.3, excluindo a memória básica que o próprio
PHP usa quando se inicia.
</para>
<para>
<example>
<title>Exemplo de uso de memória</title>
<programlisting role="php">
<![CDATA[
<?php
class Foo
{
public $var = '3.14159265359';
public $self;
}
$baseMemory = memory_get_usage();
for ( $i = 0; $i <= 100000; $i++ )
{
$a = new Foo;
$a->self = $a;
if ( $i % 500 === 0 )
{
echo sprintf( '%8d: ', $i ), memory_get_usage() - $baseMemory, "\n";
}
}
?>
]]>
</programlisting>
<mediaobject>
<alt>Comparação de uso de memória entre o PHP 5.2 e o PHP 5.3</alt>
<imageobject>
<imagedata fileref="en/features/figures/gc-benchmark.png" format="PNG"/>
</imageobject>
</mediaobject>
</example>
</para>
<para>
Neste exemplo bem acadêmico, está sendo criado um objeto no qual
uma propriedade é definida para apontar para o próprio objeto. Quando a variável <varname>$a</varname>
no script é re-atribuída na iteração seguinte do loop, um vazamento de
memória normalmente iria acontecer. Neste caso, dois contêineres são vazados
(o zval objeto e o zval propriedade), mas apenas uma raiz possível é
encontrada: a variável que perdeu a atribuição. Quando o buffer de raízes está cheio
depois de 10.000 iterações (com um total de 10.000 raízes possíveis), o mecanismo
de coleta de lixo entra e libera a memória associada com essas
raízes possíveis. Isto pode ser visto claramente com o gráfico irregular
de uso de memória para o PHP 5.3. Depois de 10.000 iterações, o mecanismo entre
e libera a memória associada com as variáveis com referência circular..
O mecanismo em si não tem muito trabalho neste exemplo,
porque a estrutura que é vazada é extremamente simples. Pelo
diagrama, pode-se verificar que o uso de memória no PHP 5.3 é de aproximadamente
9Mb, enquanto que no PHP 5.2 o uso de memória continua crescendo.
</para>
</sect2>
<sect2 xml:id="features.gc.performance-considerations.slowdowns">
<title>Atraso em Tempo de Execução</title>
<para>
A segunda área onde o mecanismo de coleta de lixo influencia o
desempenho é o tempo gasto quando o mecanismo entre
para liberar a memória "vazada". Para verificar quanto é este tempo,
o script anterior foi minimamente modificado para permitir um número maior de
iterações e a remoção dos números de uso de memória intermediária. O
segundo script está apresentado a seguir:
</para>
<para>
<example>
<title>Influência do Coletor de Lixo no desempenho</title>
<programlisting role="php">
<![CDATA[
<?php
class Foo
{
public $var = '3.14159265359';
public $self;
}
for ( $i = 0; $i <= 1000000; $i++ )
{
$a = new Foo;
$a->self = $a;
}
echo memory_get_peak_usage(), "\n";
?>
]]>
</programlisting>
</example>
</para>
<para>
O script será executado duas vezes, uma com a configuração
<link linkend="ini.zend.enable-gc">zend.enable_gc</link> habilitada,
e outra desabilitada:
</para>
<para>
<example>
<title>Executando o script acima</title>
<programlisting role="shell">
<![CDATA[
time php -dzend.enable_gc=0 -dmemory_limit=-1 -n example2.php
# and
time php -dzend.enable_gc=1 -dmemory_limit=-1 -n example2.php
]]>
</programlisting>
</example>
</para>
<para>
Em uma máquina específica, o primeiro comando parece levar 10.7 segundos,
enquanto que o segundo leva 11.4 seconds. Isto é um atraso de
aproximadamente 7%. Entretanto, a quantidade máxima de memória usada pelo
script é reduzida em 98%, de 931Mb para 10Mb. Esta referência não é muito
científica, ou mesmo representativa para aplicações do mundo real, mas
demonstra os benefícios de uso de memória que este mecanismo de coleta
de lixo fornece. A boa notícia é que este atraso é sempre de
7% para este script particular, enquando que as capacidades de
redução de memória economizam mais e mais memória quando referências
circulares adicionais são encontradas durante a execução do script.
</para>
</sect2>
<sect2 xml:id="features.gc.performance-considerations.internal-stats">
<title>Estatísticas de GC Internas do PHP</title>
<para>
É possível obter um pouco mais de informação sobre como o
o mecanismo de coleta de lixo é executado no PHP. Mas para fazer isto,
deve-se recompilar o PHP para habilitar o benchmark e o
código de coleta de dados. Deve-se definir a variável de ambiente
<literal>CFLAGS</literal> para <literal>-DGC_BENCH=1</literal> antes de executar
<literal>./configure</literal> com as opções desejadas. A sequencia a
seguir deve fazer este truque:
</para>
<para>
<example>
<title>Recompilando o PHP para habilitar o benchmarking de GC</title>
<programlisting role="shell">
<![CDATA[
export CFLAGS=-DGC_BENCH=1
./config.nice
make clean
make
]]>
</programlisting>
</example>
</para>
<para>
Quando o exemplo acima for executado novamente com o novo
binário do PHP, o resultado abaixo será visualizado assim que o
PHP terminar a execução:
</para>
<para>
<example>
<title>Estatísticas GC</title>
<programlisting role="shell">
<![CDATA[
GC Statistics
-------------
Runs: 110
Collected: 2072204
Root buffer length: 0
Root buffer peak: 10000
Possible Remove from Marked
Root Buffered buffer grey
-------- -------- ----------- ------
ZVAL 7175487 1491291 1241690 3611871
ZOBJ 28506264 1527980 677581 1025731
]]>
</programlisting>
</example>
</para>
<para>
As estatísticas mais informativas são mostradas no primeiro bloco. Pode-se
ver que aqui que o mecanismo de coleta de lixo foi executado 110 vezes, e no
total, mais de 2 milhões de alocações de memória foram liberadas durante estas
110 execuções. Assim que o mecanismo tenha sido executado pelo menos
uma vez, o "Root buffer peak" (pico do buffer de raízes) será sempre 10.000.
</para>
</sect2>
<sect2 xml:id="features.gc.performance-considerations.conclusion">
<title>Conclusãon</title>
<para>
Em geral o coletor de lixo no PHP irá causar um atraso apenas quando
o algoritmo de coleta realmente for executado, enquanto que em scripts normais
(menores), não deve haver nenhum prejuízo no desempenho.
</para>
<para>
Entretanto, em casos onde o mecanismo de coleta é executado em
scripts normais, a redução de memória que ele vai proporcionar irá permitir
que mais desses scripts possam ser executados ao mesmo tempo no servidor, já que
a quantidade de memória usada no total não será muito grande.
</para>
<para>
Os benefícios são mais aparentes para scripts de longa execução, como os
scripts de conjunto de testes ou daemons. Adicionalmente, para aplicações <link xlink:href="&url.php.gtk;">PHP-GTK</link>
que geralmente tendem a rodar por mais tempo que scripts para a Web, o novo
mecanismo deve fazer uma diferença considerável em relação a vazamentos
de memória que insistem em acontecer.
</para>
</sect2>
</sect1>
</chapter>
<!-- Keep this comment at the end of the file
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->

View File

@@ -0,0 +1,209 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 8e732e84a1425cf0ab3a5b0da8fe113c7a6da85e Maintainer: leonardolara Status: ready --><!-- CREDITS: leonardolara -->
<sect1 xml:id="install.windows.commandline" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>PHP em Linha de Comando no Microsoft Windows</title>
<para>
Esta seção contém notas e dicas específicas para que o PHP
seja executado da linha de comando do Windows.
</para>
<note>
<para>
Deve-se ler os passos do <link linkend="install.windows.manual">manual
de instalação</link> primeiro!
</para>
</note>
<para>
Configurar o PHP para ser executado da linha de comando pode ser feito sem
nenhuma mudança no Windows.
<screen>
<![CDATA[
C:\php\php.exe -f "C:\PHP Scripts\script.php" -- -arg1 -arg2 -arg3
]]>
</screen>
</para>
<para>
Porém há alguns passos fáceis que podem ser seguidos para tornar o processo mais simples.
Alguns desses passos podem já ter sido executados, mas estão repetidos aqui
para fornecer uma sequência completa, passo a passo.
<itemizedlist>
<note>
<para>
<envar>PATH</envar> e <envar>PATHEXT</envar> são importantes variáveis
de sistemas pré-existentes no Windows,
e deve-se tomar cuidado para não sobrescrever nenhuma das duas,
apenas concatenar valores.
</para>
</note>
<listitem>
<para>
Concatene a localização do executável do PHP (<filename>php.exe</filename>,
<filename>php-win.exe</filename> ou <filename>php-cli.exe</filename>
dependendo da versão do PHP e preferências de visualização) à variável
de ambiente <envar>PATH</envar>. Leia mais sobre como adicionar
a pasta do PHP à variável <envar>PATH</envar> na <link
linkend="faq.installation.addtopath">entrada FAQ correspondente</link>.
</para>
</listitem>
<listitem>
<para>
Adicione a extensão <literal>.PHP</literal> à variável de
ambiente <varname>PATHEXT</varname>. Isto pode ser feito
ao mesmo tempo que se adiciona à variável <envar>PATH</envar>.
Siga os mesmos passos descritos no <link
linkend="faq.installation.addtopath">FAQ</link> mas adicione à variável
<varname>PATHEXT</varname> no lugar da variável
<envar>PATH</envar>.
<note>
<para>
A posição em que você inserir a extensão <literal>.PHP</literal> irá
determinar qual script ou programa será executado quando o nome do arquivo
for especificado. Por exemplo, inserir <literal>.PHP</literal> antes de
<literal>.BAT</literal> irá fazer com que seu script seja executado, em vez
do arquivo de lote, se existir um arquivo de lote com o mesmo nome.
</para>
</note>
</para>
</listitem>
<listitem>
<para>
Associe a extensão <literal>.PHP</literal> com o tipo de arquivo. Isto
pode ser feito executando o seguinte comando:
<screen>
<![CDATA[
assoc .php=phpfile
]]>
</screen>
</para>
</listitem>
<listitem>
<para>
Associe o tipo de arquivo <literal>phpfile</literal> com o executável PHP
apropriado. Isto pode ser feito executando o seguinte comando:
<screen>
<![CDATA[
ftype phpfile="C:\php\php.exe" -f "%1" -- %~2
]]>
</screen>
</para>
</listitem>
</itemizedlist>
</para>
<para>
Seguir estes passos irá permitir que os scripts PHP sejam executados de qualquer pasta
sem a necessidade de digitar o executável PHP ou a extensão
<literal>.PHP</literal> e todos os parâmetros serão fornecidos ao script para processamento.
</para>
<para>
O exemplo abaixo detalha algumas das alterações de registro que podem ser realizadas manualmente.
<example>
<title>Alterações de Registro</title>
<screen>
<![CDATA[
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.php]
@="phpfile"
"Content Type"="application/php"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\phpfile]
@="PHP Script"
"EditFlags"=dword:00000000
"BrowserFlags"=dword:00000008
"AlwaysShowExt"=""
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\phpfile\DefaultIcon]
@="C:\\php\\php-win.exe,0"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\phpfile\shell]
@="Open"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\phpfile\shell\Open]
@="&Open"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\phpfile\shell\Open\command]
@="\"C:\\php\\php.exe\" -f \"%1\" -- %~2"
]]>
</screen>
</example>
</para>
<para>
Com estas alterações o mesmo comando pode ser escrito como:
<screen>
<![CDATA[
"C:\PHP Scripts\script" -arg1 -arg2 -arg3
]]>
</screen>
ou, se o caminho <literal>"C:\PHP Scripts"</literal> estiver na
variável de ambiente <envar>PATH</envar>:
<screen>
<![CDATA[
script -arg1 -arg2 -arg3
]]>
</screen>
</para>
<note>
<para>
Existe um pequeno problema se a intenção for usar esta técnica e usar
os scripts PHP como um filtro de linha de comando, como o exemplo abaixo:
<screen>
<![CDATA[
dir | "C:\PHP Scripts\script" -arg1 -arg2 -arg3
]]>
</screen>
ou
<screen>
<![CDATA[
dir | script -arg1 -arg2 -arg3
]]>
</screen>
Neste caso, o script poderá simplesmente travar e não produzir nenhuma saída.
Para tornar esta opção operacional, deve-se fazer uma outra alteração no registro.
<screen>
<![CDATA[
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\Explorer]
"InheritConsoleHandles"=dword:00000001
]]>
</screen>
Mais informações sobre este problema pode ser encontrado neste artigo <link
xlink:href="http://support.microsoft.com/default.aspx?scid=kb;en-us;321788">Microsoft
Knowledgebase Article : 321788</link>.
A partir do Windows 10, esta configuração foi invertida, fazendo com que a instalação padrão do
Windows 10 suporte automaticamente esta opção. Esta postagem do <link
xlink:href="https://social.msdn.microsoft.com/Forums/en-US/f19d740d-21c8-4dc2-a9ab-d5c0527e932b/nasty-file-association-regression-bug-in-windows-10-console?forum=windowssdk">
Microsoft Forum</link> fornece a explicação.
</para>
</note>
</sect1>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->

103
install/windows/manual.xml Normal file
View File

@@ -0,0 +1,103 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 8e732e84a1425cf0ab3a5b0da8fe113c7a6da85e Maintainer: leonardolara Status: ready --><!-- CREDITS: leonardolara -->
<sect1 xml:id="install.windows.manual" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Instalação Manual do PHP no Windows</title>
<sect2>
<title>Escolhendo o Servidor Web</title>
<sect3>
<title>IIS</title>
<para>
O servidor IIS já vem embutido na instalação do Windows.
No Windows Server, o papel do IIS pode ser adicionado pelo Gerenciados do Servidor. O recurso CGI Role precisa ser incluído.
No Windows Desktop, o IIS precisa ser instalado pelo Painel de Controle, na opção Adicionar/Remover Programas.
A documentação da Microsoft tem <link xlink:href="https://docs.microsoft.com/en-us/previous-versions/ms181052(v=vs.80)">instruções detalhadas</link>.
No caso de aplicações web para computadores e desenvolvimento web, o IIS/Express ou PHP Desktop também podem ser usados.
<example>
<title>Linha de comando para configurar IIS e PHP</title>
<programlisting>
<![CDATA[
@echo off
REM Baixe o arquivo .ZIP da versão do PHP no link http://windows.php.net/downloads/
REM Caminho para a pasta onde deve-se descompactar o arquivo .ZIP do PHP (sem \ no final)
set phppath=c:\php
REM Limpe os manipuladores atuais do PHP
%windir%\system32\inetsrv\appcmd clear config /section:system.webServer/fastCGI
REM O comando a seguir irá gerar uma mensagem de erro se o PHP não estiver instalado. Isto pode ser ignorado.
%windir%\system32\inetsrv\appcmd set config /section:system.webServer/handlers /-[name='PHP_via_FastCGI']
REM Defina os manipuladores do PHP
%windir%\system32\inetsrv\appcmd set config /section:system.webServer/fastCGI /+[fullPath='%phppath%\php-cgi.exe']
%windir%\system32\inetsrv\appcmd set config /section:system.webServer/handlers /+[name='PHP_via_FastCGI',path='*.php',verb='*',modules='FastCgiModule',scriptProcessor='%phppath%\php-cgi.exe',resourceType='Unspecified']
%windir%\system32\inetsrv\appcmd set config /section:system.webServer/handlers /accessPolicy:Read,Script
REM Configure as variáveis FastCGI
%windir%\system32\inetsrv\appcmd set config -section:system.webServer/fastCgi /[fullPath='%phppath%\php-cgi.exe'].instanceMaxRequests:10000
%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi /+"[fullPath='%phppath%\php-cgi.exe'].environmentVariables.[name='PHP_FCGI_MAX_REQUESTS',value='10000']"
%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi /+"[fullPath='%phppath%\php-cgi.exe'].environmentVariables.[name='PHPRC',value='%phppath%\php.ini']"
]]>
</programlisting>
</example>
</para>
</sect3>
<sect3>
<title>Apache</title>
<para>
Existem várias compilações de Apache2 para Windows.
As compilações do ApacheLounge são recomendadas, mas há outras opções incluindo XAMPP, WampServer e BitNami, que fornecem ferramentas de instalação automática.
PHP pode ser usado no Apache através do mod_php ou do mod_fastcgi.
mod_php requer uma compilação TS (thread safe) do Apache, com a mesma versão de Visual C e para a mesma CPU (x86 ou x64).
</para>
</sect3>
</sect2>
<sect2>
<title>Escolha a Compilação</title>
<para>
Compilações para o Windows podem ser baixadas de <link xlink:href="http://windows.php.net/download/">http://windows.php.net/download/</link>.
Todas as compilações são otimizadas (<abbrev>PGO</abbrev>), e as versões QA e GA são extensivamente testadas.
</para>
<para>
Existem 4 tipos de compilação do PHP:
<itemizedlist spacing="compact">
<listitem>
<para>Thread-Safe(TS) - para servidores web de processo único, como Apache com mod_php.</para>
</listitem>
<listitem>
<para>Non-Thread-Safe(NTS) - para IIS e outros servidores web FastCGI (Apache com mod_fastcgi) e recomendado para scripts de linha de comando.</para>
</listitem>
<listitem>
<para>x86 - para sistemas de 32-bits.</para>
</listitem>
<listitem>
<para>x64 - para sistemas de 64-bits.</para>
</listitem>
</itemizedlist>
</para>
</sect2>
</sect1>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->

View File

@@ -0,0 +1,111 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 8e732e84a1425cf0ab3a5b0da8fe113c7a6da85e Maintainer: leonardolara Status: ready --><!-- CREDITS: leonardolara -->
<sect1 xml:id="install.windows.recommended" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Configuração Recomendada em sistemas Windows</title>
<sect2>
<title>OpCache</title>
<para>
É altamente recomendado habilitar o OpCache.
Esta extensão é incluída no PHP para Windows.
Ela compila e otimiza os scripts PHP e os mantém na memória cache para
que não sejam compilados toda vez que uma página é carregada.
</para>
<para>
Configure o &php.ini;:
<example>
<title>Configuração recomendada do OpCache</title>
<screen>
<![CDATA[
opcache.enable=On
opcache.enable_cli=On
]]>
</screen>
</example>
Reinicie o servidor web.
Para mais informação, consulte: <link linkend="opcache.configuration">Configuração OpCache</link>
</para>
</sect2>
<sect2>
<title>WinCache</title>
<para>
Recomenda-se usar o WinCache se o IIS for usado, especialmente em um ambiente
de hospedagem web compartilhado ou em armazenamento de arquivos de rede (NAS).
Note que o WinCache não é mais suportado a partir do PHP 8.0.0.
Todas as aplicações PHP se beneficiam automaticamente do recurso de cache de arquivo do WinCache. Operações do sistema de arquivos são armazenadas em cache.
WinCache também armazena em cache objetos de usuário e compartilha-os entre os processos <varname>php.exe</varname> ou <varname>php-cgi.exe</varname> (compartilha objetos entre requisições).
Muitas das grandes aplicações web têm um plugin ou extensão ou opção de configuração para uso do WinCache para cache de objetos de usuário.
Se um alto desempenho é requerido, deve-se usar cache de objetos na aplicação.
Consulte: <link xlink:href="http://pecl.php.net/package/WinCache">http://pecl.php.net/package/WinCache</link> para baixar uma DLL WinCache (or tgz) para a pasta de extensões PHP (extensions_dir no php.ini).
Configure o &php.ini;:
<example>
<title>Configuração WinCache recomendada</title>
<screen>
<![CDATA[
extension=php_wincache.dll
wincache.fcenabled=1
wincache.ocenabled=1 ; removida a partir do wincache 2.0.0.0
]]>
</screen>
</example>
Para mais informação, consulte:
<link linkend="wincache.configuration">Configuração WinCache</link>
</para>
</sect2>
<sect2>
<title>Configuração IIS</title>
<para>
No Gerenciador IIS, instale o módulo FastCGI e adicione um manipulador para mapear a
extensão <varname>`.php`</varname> para o caminho do <varname>PHP-CGI.exe</varname>
(não para o <varname>PHP.exe</varname>)
</para>
<para>
Pode ser usado o Prompt de Comando para configurar o IIS via script.
</para>
</sect2>
<sect2>
<title>Banco de Dados</title>
<para>
Provavelmente será necessário um Servidor de Banco de Dados.
Bancos de dados populares fornecem extensões PHP para que possam ser utilizados.
Se o site não tiver um tráfego muito alto,
o servidor de banco de dados pode ser executado no mesmo servidor web.
Muitos bancos de dados populares podem são compatíveis com o Windows.
</para>
<para>O PHP inclui as extensões mysqli e pdo_mysql.</para>
<para>
Consulte <link xlink:href="https://dev.mysql.com/downloads/windows/">https://dev.mysql.com/downloads/windows/</link>
</para>
</sect2>
</sect1>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->

38
install/windows/tools.xml Normal file
View File

@@ -0,0 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: c55dde8f549a2f939adfd924fe6e6d242c7754d3 Maintainer: leonardolara Status: ready --><!-- CREDITS: leonardolara -->
<sect1 xml:id="install.windows.tools" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Ferramentas de instalação do PHP no Windows</title>
<sect2>
<title>Ferramentas de instalação do PHP</title>
<para>
<link xlink:href="https://www.apachefriends.org/index.html">XAMPP</link>,
WampServer e BitNami irão configurar as aplicações PHP para utilização com Apache no Windows.
</para>
<para>
Preparar e configurar o Nginx no Windows requer um pouco mais de configuração.
Consulte a <link xlink:href="https://www.nginx.com/resources/wiki/start/topics/examples/phpfastcgionwindows/">documentação Nginx</link>
para apoio adicional.
</para>
</sect2>
</sect1>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->

View File

@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 53afbdaf791ddbc4455672122573644f3f0d7949 Maintainer: leonardolara Status: ready --><!-- CREDITS: leonardolara -->
<sect1 xml:id="install.windows.troubleshooting" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Solução de Problemas do PHP no Windows</title>
<sect2>
<title>Verifique as Permissões da Pasta Temporária</title>
<procedure>
<step>
<para>
Clique com o botão direito na pasta de arquivos temporários no Explorador de Arquivos para obter as permissões.
</para>
</step>
<step>
<para>
Para o IIS, verifique que o usuário IIS_User tem a permissão de MODIFICAÇÃO.
Pode-se obter o caminho da pasta de arquivos temporários no arquivos de configuração ou na função php_info.
</para>
</step>
</procedure>
</sect2>
</sect1>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 5a14f904d231d294e2e5b4fb5d2fc4d2fd9eddee Maintainer: adiel Status: ready --><!-- CREDITS: adiel, ae, atomotavio, fabioluciano, felipe, klaussilveira, rafaelbernard -->
<!-- EN-Revision: ca426e50716c122e6fed8009369792e98d7c57b8 Maintainer: adiel Status: ready --><!-- CREDITS: adiel, ae, atomotavio, fabioluciano, felipe, klaussilveira, rafaelbernard, leonardolara -->
<!ENTITY installation.enabled.disable 'Esta extensão está habilitada por padrão. Ela pode ser desabilitada usando a seguinte opção em tempo de compilação: '>
@@ -2383,13 +2383,19 @@ relativos</simpara></warning>
</row>
'>
<!ENTITY mongodb.option.encryption.kmsProviders '
<row xmlns="http://docbook.org/ns/docbook">
<row xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<entry>kmsProviders</entry>
<entry><type>array</type></entry>
<entry>
<para>
Um documento contendo a configuração de um ou mais provedores KMS, que são usados para criptografar chaves de dados. Os provedores compatíveis incluem <literal>"aws"</literal>, <literal>"azure"</literal>, <literal>"gcp"</literal>, <literal>"kmip"</literal> e <literal>"local"</literal> e pelo menos um deve ser especificado.
</para>
<para>
Se um documento vazio for especificado para <literal>"aws"</literal>,
<literal>"azure"</literal>, ou <literal>"gcp"</literal>, o driver
tentará configurar o provedor usando
<link xlink:href="&url.mongodb.specs;/blob/master/source/client-side-encryption/client-side-encryption.rst#automatic-credentials">Credenciais Automáticas</link>.
</para>
<para>
O formato para <literal>"aws"</literal> é o seguinte:
</para>

106
language/context/zip.xml Normal file
View File

@@ -0,0 +1,106 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: ec6e871a47fa15228aa3299f46fed826422adbc0 Maintainer: leonardolara Status: ready --><!-- CREDITS: leonardolara -->
<refentry xml:id="context.zip" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" annotations="verify_info:false">
<refnamediv>
<refname>Opções de contexto para Zip</refname>
<refpurpose>Listagem de opções de contexto para Zip</refpurpose>
</refnamediv>
<refsect1 role="description"><!-- {{{ -->
&reftitle.description;
<para>
Opções de contexto para Zip estão disponíveis para encapsuladores <literal>zip</literal>.
</para>
</refsect1><!-- }}} -->
<refsect1 role="options"><!-- {{{ -->
&reftitle.options;
<para>
<variablelist>
<varlistentry xml:id="context.zip.password">
<term><parameter>password</parameter></term>
<listitem>
<para>
Utilizado para especificar a senha definida para o arquivo criptografado.
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1><!-- }}} -->
<refsect1 role="changelog"><!-- {{{ -->
&reftitle.changelog;
<para>
<informaltable>
<tgroup cols="2">
<thead>
<row>
<entry>&Version;</entry>
<entry>&Description;</entry>
</row>
</thead>
<tbody>
<row>
<entry>PHP 7.2.0, PECL zip 1.14.0</entry>
<entry>
Incluído o parâmetro <parameter>password</parameter>.
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</para>
</refsect1><!-- }}} -->
<refsect1 role="examples"><!-- {{{ -->
&reftitle.examples;
<para>
<example xml:id="context.zip.example-password"><!-- {{{ -->
<title>Exemplo básico de uso de <parameter>password</parameter></title>
<programlisting role="php">
<![CDATA[
<?php
// Ler o arquivo criptografado
$opts = array(
'zip' => array(
'password' => 'secret',
),
);
// criar o contexto...
$context = stream_context_create($opts);
// ...e usá-lo para obter os dados
echo file_get_contents('zip://test.zip#test.txt', false, $context);
?>
]]>
</programlisting>
</example><!-- }}} -->
</para>
</refsect1><!-- }}} -->
</refentry>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->

78
language/context/zlib.xml Normal file
View File

@@ -0,0 +1,78 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: ec6e871a47fa15228aa3299f46fed826422adbc0 Maintainer: leonardolara Status: ready --><!-- CREDITS: leonardolara -->
<refentry xml:id="context.zlib" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" annotations="verify_info:false">
<refnamediv>
<refname>Opções de contexto Zlib</refname>
<refpurpose>Listagem de opções de contexto Zlib</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<para>
Opções de contexto Zlib estão disponíveis para encapsuladores <literal>zlib</literal>.
</para>
</refsect1>
<refsect1 role="options">
&reftitle.options;
<para>
<variablelist>
<varlistentry xml:id="context.zlib.level">
<term><parameter>level</parameter></term>
<listitem>
<para>
Usado para especificar o nível de compressão (<literal>0</literal> - <literal>9</literal>).
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>
<refsect1 role="changelog">
&reftitle.changelog;
<para>
<informaltable>
<tgroup cols="2">
<thead>
<row>
<entry>&Version;</entry>
<entry>&Description;</entry>
</row>
</thead>
<tbody>
<row>
<entry>7.3.0</entry>
<entry>
O parâmetro <parameter>level</parameter> foi incluído.
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</para>
</refsect1>
</refentry>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: f0fe52e5a693be46f0c81012b15b929ad264228e Maintainer: fabioluciano Status: ready --><!-- CREDITS: fabioluciano -->
<!-- EN-Revision: 7a75b854c8c52226d38397e7e8177e339fdb273f Maintainer: fabioluciano Status: ready --><!-- CREDITS: fabioluciano, leonardolara -->
<chapter xml:id="language.errors" xmlns="http://docbook.org/ns/docbook">
<title>Erros</title>
@@ -7,9 +7,9 @@
<title>Introdução</title>
<para>
Infelizmente, não importa quão cuidosos somos escrevendo nossos códigos, erros são
Infelizmente, não importa quão cuidadosos somos escrevendo nossos códigos, erros são
fatos da vida. O PHP reportará erros, advertências e avisos para muitos
problemas comuns de codificação e problemas em tempo de execução, e saber como detectar e manusear estes
problemas comuns de codificação e problemas em tempo de execução, e saber como detectar e lidar com estes
erros farão o processo de depuração muito mais fácil.
</para>
</sect1>

View File

@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <!-- EN-Revision: 6e69d9342ef5b124a62c8a255cb0d9a091d07b5e Maintainer: adaiasmagdiel Status: ready --><!-- CREDITS: adaiasmagdiel -->
<?xml version="1.0" encoding="utf-8"?> <!-- EN-Revision: 14767af0f05dffa6fdb9b49e1a1f4e9ca7022a60 Maintainer: adaiasmagdiel Status: ready --><!-- CREDITS: adaiasmagdiel, leonardolara -->
<phpdoc:classref xml:id="class.allowdynamicproperties" xmlns:phpdoc="http://php.net/ns/phpdoc" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xi="http://www.w3.org/2001/XInclude">
<title>A classe AllowDynamicProperties</title>
<titleabbrev>AllowDynamicProperties</titleabbrev>
@@ -16,18 +16,12 @@
<section xml:id="allowdynamicproperties.synopsis">
&reftitle.classsynopsis;
<classsynopsis>
<classsynopsis class="class">
<ooclass>
<modifier>final</modifier>
<classname>AllowDynamicProperties</classname>
</ooclass>
<classsynopsisinfo>
<ooclass>
<modifier>final</modifier>
<classname>AllowDynamicProperties</classname>
</ooclass>
</classsynopsisinfo>
<classsynopsisinfo role="comment">&Methods;</classsynopsisinfo>
<xi:include xpointer="xmlns(db=http://docbook.org/ns/docbook) xpointer(id('class.allowdynamicproperties')/db:refentry/db:refsect1[@role='description']/descendant::db:constructorsynopsis[@role='AllowDynamicProperties'])">
<xi:fallback/>

View File

@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <!-- EN-Revision: ee1ebe8df676914b22b5e39e53b34db65e240c89 Maintainer: adaiasmagdiel Status: ready --><!-- CREDITS: adaiasmagdiel -->
<?xml version="1.0" encoding="utf-8"?> <!-- EN-Revision: 14767af0f05dffa6fdb9b49e1a1f4e9ca7022a60 Maintainer: adaiasmagdiel Status: ready --><!-- CREDITS: adaiasmagdiel, leonardolara -->
<phpdoc:classref xml:id="class.attribute" xmlns:phpdoc="http://php.net/ns/phpdoc" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xi="http://www.w3.org/2001/XInclude">
<title>A classe Attribute</title>
<titleabbrev>Attribute</titleabbrev>
@@ -21,18 +21,12 @@
<section xml:id="attribute.synopsis">
&reftitle.classsynopsis;
<classsynopsis>
<classsynopsis class="class">
<ooclass>
<modifier>final</modifier>
<classname>Attribute</classname>
</ooclass>
<classsynopsisinfo>
<ooclass>
<modifier>final</modifier>
<classname>Attribute</classname>
</ooclass>
</classsynopsisinfo>
<classsynopsisinfo role="comment">&Constants;</classsynopsisinfo>
<fieldsynopsis>
<modifier>const</modifier>

View File

@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <!-- EN-Revision: 6e69d9342ef5b124a62c8a255cb0d9a091d07b5e Maintainer: adaiasmagdiel Status: ready --><!-- CREDITS: adaiasmagdiel -->
<?xml version="1.0" encoding="utf-8"?> <!-- EN-Revision: 14767af0f05dffa6fdb9b49e1a1f4e9ca7022a60 Maintainer: adaiasmagdiel Status: ready --><!-- CREDITS: adaiasmagdiel, leonardolara -->
<phpdoc:classref xml:id="class.returntypewillchange" xmlns:phpdoc="http://php.net/ns/phpdoc" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xi="http://www.w3.org/2001/XInclude">
<title>A classe ReturnTypeWillChange</title>
<titleabbrev>ReturnTypeWillChange</titleabbrev>
@@ -21,18 +21,12 @@
<section xml:id="returntypewillchange.synopsis">
&reftitle.classsynopsis;
<classsynopsis>
<classsynopsis class="class">
<ooclass>
<modifier>final</modifier>
<classname>ReturnTypeWillChange</classname>
</ooclass>
<classsynopsisinfo>
<ooclass>
<modifier>final</modifier>
<classname>ReturnTypeWillChange</classname>
</ooclass>
</classsynopsisinfo>
<classsynopsisinfo role="comment">&Methods;</classsynopsisinfo>
<xi:include xpointer="xmlns(db=http://docbook.org/ns/docbook) xpointer(id('class.returntypewillchange')/db:refentry/db:refsect1[@role='description']/descendant::db:constructorsynopsis[@role='ReturnTypeWillChange'])">
<xi:fallback/>

View File

@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <!-- EN-Revision: 49e193c69bb79503cf9efeb5f25be7f371051ef5 Maintainer: adaiasmagdiel Status: ready --><!-- CREDITS: adaiasmagdiel -->
<?xml version="1.0" encoding="utf-8"?> <!-- EN-Revision: 14767af0f05dffa6fdb9b49e1a1f4e9ca7022a60 Maintainer: adaiasmagdiel Status: ready --><!-- CREDITS: adaiasmagdiel, leonardolara -->
<phpdoc:classref xml:id="class.sensitiveparameter" xmlns:phpdoc="http://php.net/ns/phpdoc" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xi="http://www.w3.org/2001/XInclude">
<title>A classe SensitiveParameter</title>
<titleabbrev>SensitiveParameter</titleabbrev>
@@ -17,18 +17,12 @@
<section xml:id="sensitiveparameter.synopsis">
&reftitle.classsynopsis;
<classsynopsis>
<classsynopsis class="class">
<ooclass>
<modifier>final</modifier>
<classname>SensitiveParameter</classname>
</ooclass>
<classsynopsisinfo>
<ooclass>
<modifier>final</modifier>
<classname>SensitiveParameter</classname>
</ooclass>
</classsynopsisinfo>
<classsynopsisinfo role="comment">&Methods;</classsynopsisinfo>
<xi:include xpointer="xmlns(db=http://docbook.org/ns/docbook) xpointer(id('class.sensitiveparameter')/db:refentry/db:refsect1[@role='description']/descendant::db:constructorsynopsis[@role='SensitiveParameter'])">
<xi:fallback/>

View File

@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: cb0630b14901459c0bf1556e7d68f1b4c0d3796e Maintainer: fabioluciano Status: ready --><!-- CREDITS: felipe, fabioluciano -->
<!-- EN-Revision: a6d209f4ff71ccba3f1255902827f5df3e092ff9 Maintainer: fabioluciano Status: ready --><!-- CREDITS: felipe, fabioluciano, leonardolara -->
<refentry role="variable" xml:id="reserved.variables.httpresponseheader" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<refnamediv>
<refname>$http_response_header</refname>
@@ -28,10 +29,10 @@
<?php
function get_contents() {
file_get_contents("http://example.com");
var_dump($http_response_header);
var_dump($http_response_header); // variable is populated in the local scope
}
get_contents();
var_dump($http_response_header);
var_dump($http_response_header); // a call to get_contents() does not populate the variable outside the function scope
?>
]]>
</programlisting>
@@ -58,6 +59,8 @@ array(9) {
[8]=>
string(38) "Content-Type: text/html; charset=UTF-8"
}
Warning: Undefined variable $http_response_header
NULL
]]>
</screen>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: fd6629b1acf5a4b21d3e1ed3f4f33057b4fb3178 Maintainer: felipe Status: ready --><!-- CREDITS: adiel,felipe,ABDALAZARD -->
<!-- EN-Revision: a6d209f4ff71ccba3f1255902827f5df3e092ff9 Maintainer: felipe Status: ready --><!-- CREDITS: adiel,felipe,ABDALAZARD,leonardolara -->
<refentry role="variable" xml:id="language.variables.superglobals" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" annotations="verify_info:false">
<refnamediv>

View File

@@ -0,0 +1,84 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 696b6b9e32d8d4ef4cfd874caf677a47a6cbadb4 Maintainer: leonardolara Status: ready --><!-- CREDITS: leonardolara -->
<phpdoc:exceptionref xml:id="class.dateerror" xmlns:phpdoc="http://php.net/ns/phpdoc" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xi="http://www.w3.org/2001/XInclude">
<title>A classe DateError</title>
<titleabbrev>DateError</titleabbrev>
<partintro>
<!-- {{{ DateError intro -->
<section xml:id="dateerror.intro">
&reftitle.intro;
<para>
Disparada quando o banco de dados de fuso horário não for encontrado ou contiver dados inválidos.
</para>
<para>
Este erro nunca deveria ocorrer, e não é dependente do código. Existem duas
exceções-filhas (<exceptionname>DateObjectError</exceptionname> e
<exceptionname>DateRangeError</exceptionname>) que são disparadas dependendo
do erro do programados ou de problemas relacionados a faixas de datas.
</para>
</section>
<!-- }}} -->
<section xml:id="dateerror.synopsis">
&reftitle.classsynopsis;
<!-- {{{ Synopsis -->
<classsynopsis class="class">
<ooexception>
<exceptionname>DateError</exceptionname>
</ooexception>
<ooclass>
<modifier>extends</modifier>
<classname>Error</classname>
</ooclass>
<classsynopsisinfo role="comment">&InheritedProperties;</classsynopsisinfo>
<xi:include xpointer="xmlns(db=http://docbook.org/ns/docbook) xpointer(id('class.error')/db:partintro/db:section/db:classsynopsis/db:fieldsynopsis[preceding-sibling::db:classsynopsisinfo[1][@role='comment' and text()='&Properties;']]))">
<xi:fallback/>
</xi:include>
<classsynopsisinfo role="comment">&InheritedMethods;</classsynopsisinfo>
<xi:include xpointer="xmlns(db=http://docbook.org/ns/docbook) xpointer(id('class.error')/db:refentry/db:refsect1[@role='description']/descendant::db:constructorsynopsis[@role='Error'])">
<xi:fallback/>
</xi:include>
<xi:include xpointer="xmlns(db=http://docbook.org/ns/docbook) xpointer(id('class.error')/db:refentry/db:refsect1[@role='description']/descendant::db:methodsynopsis[@role='Error'])">
<xi:fallback/>
</xi:include>
</classsynopsis>
<!-- }}} -->
</section>
<section role="seealso">
&reftitle.seealso;
<simplelist>
<member><exceptionname>DateObjectError</exceptionname></member>
<member><exceptionname>DateRangeError</exceptionname></member>
</simplelist>
</section>
</partintro>
</phpdoc:exceptionref>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->

View File

@@ -0,0 +1,82 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 696b6b9e32d8d4ef4cfd874caf677a47a6cbadb4 Maintainer: leonardolara Status: ready --><!-- CREDITS: leonardolara -->
<phpdoc:exceptionref xml:id="class.dateexception" xmlns:phpdoc="http://php.net/ns/phpdoc" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xi="http://www.w3.org/2001/XInclude">
<title>A classe DateException</title>
<titleabbrev>DateException</titleabbrev>
<partintro>
<!-- {{{ DateException intro -->
<section xml:id="dateexception.intro">
&reftitle.intro;
<para>
Classe pai das exceções de Data/Hora, para problemas que surgem devido a
entradas do usuário ou argumentos texto em formato livre que precisam ser analisados.
</para>
<para>
As exceções-filhas a seguir são disparadas pela extensão:
<itemizedlist>
<listitem><simpara><exceptionname>DateInvalidOperationException</exceptionname></simpara></listitem>
<listitem><simpara><exceptionname>DateInvalidTimezoneException</exceptionname></simpara></listitem>
<listitem><simpara><exceptionname>DateMalformedIntervalStringException</exceptionname></simpara></listitem>
<listitem><simpara><exceptionname>DateMalformedPeriodStringException</exceptionname></simpara></listitem>
<listitem><simpara><exceptionname>DateMalformedStringException</exceptionname></simpara></listitem>
</itemizedlist>
</para>
</section>
<!-- }}} -->
<section xml:id="dateexception.synopsis">
&reftitle.classsynopsis;
<!-- {{{ Synopsis -->
<classsynopsis class="class">
<ooexception>
<exceptionname>DateException</exceptionname>
</ooexception>
<ooclass>
<modifier>extends</modifier>
<classname>Exception</classname>
</ooclass>
<classsynopsisinfo role="comment">&InheritedProperties;</classsynopsisinfo>
<xi:include xpointer="xmlns(db=http://docbook.org/ns/docbook) xpointer(id('class.exception')/db:partintro/db:section/db:classsynopsis/db:fieldsynopsis[preceding-sibling::db:classsynopsisinfo[1][@role='comment' and text()='&Properties;']]))">
<xi:fallback/>
</xi:include>
<classsynopsisinfo role="comment">&InheritedMethods;</classsynopsisinfo>
<xi:include xpointer="xmlns(db=http://docbook.org/ns/docbook) xpointer(id('class.exception')/db:refentry/db:refsect1[@role='description']/descendant::db:constructorsynopsis[@role='Exception'])">
<xi:fallback/>
</xi:include>
<xi:include xpointer="xmlns(db=http://docbook.org/ns/docbook) xpointer(id('class.exception')/db:refentry/db:refsect1[@role='description']/descendant::db:methodsynopsis[@role='Exception'])">
<xi:fallback/>
</xi:include>
</classsynopsis>
<!-- }}} -->
</section>
</partintro>
</phpdoc:exceptionref>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->

View File

@@ -0,0 +1,79 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 696b6b9e32d8d4ef4cfd874caf677a47a6cbadb4 Maintainer: leonardolara Status: ready --><!-- CREDITS: leonardolara -->
<phpdoc:exceptionref xml:id="class.dateinvalidoperationexception" xmlns:phpdoc="http://php.net/ns/phpdoc" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xi="http://www.w3.org/2001/XInclude">
<title>A classe DateInvalidOperationException</title>
<titleabbrev>DateInvalidOperationException</titleabbrev>
<partintro>
<!-- {{{ DateInvalidOperationException intro -->
<section xml:id="dateinvalidoperationexception.intro">
&reftitle.intro;
<para>
Disparada por <methodname>DateTimeImmutable::sub</methodname> e
<methodname>DateTime::sub</methodname> quando uma operação não suportada é
solicitada.
</para>
<para>
Um exemplo de operação não suportada é o uso de
um objeto <classname>DateInterval</classname> representando especificação de tempo
relativo como <literal>next weekday</literal>, que não
permite construir um objeto por ser inválido.
</para>
</section>
<!-- }}} -->
<section xml:id="dateinvalidoperationexception.synopsis">
&reftitle.classsynopsis;
<!-- {{{ Synopsis -->
<classsynopsis class="class">
<ooexception>
<exceptionname>DateInvalidOperationException</exceptionname>
</ooexception>
<ooclass>
<modifier>extends</modifier>
<classname>DateException</classname>
</ooclass>
<classsynopsisinfo role="comment">&InheritedProperties;</classsynopsisinfo>
<xi:include xpointer="xmlns(db=http://docbook.org/ns/docbook) xpointer(id('class.exception')/db:partintro/db:section/db:classsynopsis/db:fieldsynopsis[preceding-sibling::db:classsynopsisinfo[1][@role='comment' and text()='&Properties;']]))">
<xi:fallback/>
</xi:include>
<classsynopsisinfo role="comment">&InheritedMethods;</classsynopsisinfo>
<xi:include xpointer="xmlns(db=http://docbook.org/ns/docbook) xpointer(id('class.exception')/db:refentry/db:refsect1[@role='description']/descendant::db:constructorsynopsis[@role='Exception'])">
<xi:fallback/>
</xi:include>
<xi:include xpointer="xmlns(db=http://docbook.org/ns/docbook) xpointer(id('class.exception')/db:refentry/db:refsect1[@role='description']/descendant::db:methodsynopsis[@role='Exception'])">
<xi:fallback/>
</xi:include>
</classsynopsis>
<!-- }}} -->
</section>
</partintro>
</phpdoc:exceptionref>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->

View File

@@ -0,0 +1,72 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 696b6b9e32d8d4ef4cfd874caf677a47a6cbadb4 Maintainer: leonardolara Status: ready --><!-- CREDITS: leonardolara -->
<phpdoc:exceptionref xml:id="class.dateinvalidtimezoneexception" xmlns:phpdoc="http://php.net/ns/phpdoc" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xi="http://www.w3.org/2001/XInclude">
<title>A classe DateInvalidTimeZoneException</title>
<titleabbrev>DateInvalidTimeZoneException</titleabbrev>
<partintro>
<!-- {{{ DateInvalidTimeZoneException intro -->
<section xml:id="dateinvalidtimezoneexception.intro">
&reftitle.intro;
<para>
Disparada quando um valor incorreto é passado para
<methodname>DateTimeZone::__construct</methodname>.
</para>
</section>
<!-- }}} -->
<section xml:id="dateinvalidtimezoneexception.synopsis">
&reftitle.classsynopsis;
<!-- {{{ Synopsis -->
<classsynopsis class="class">
<ooexception>
<exceptionname>DateInvalidTimeZoneException</exceptionname>
</ooexception>
<ooclass>
<modifier>extends</modifier>
<classname>DateException</classname>
</ooclass>
<classsynopsisinfo role="comment">&InheritedProperties;</classsynopsisinfo>
<xi:include xpointer="xmlns(db=http://docbook.org/ns/docbook) xpointer(id('class.exception')/db:partintro/db:section/db:classsynopsis/db:fieldsynopsis[preceding-sibling::db:classsynopsisinfo[1][@role='comment' and text()='&Properties;']]))">
<xi:fallback/>
</xi:include>
<classsynopsisinfo role="comment">&InheritedMethods;</classsynopsisinfo>
<xi:include xpointer="xmlns(db=http://docbook.org/ns/docbook) xpointer(id('class.exception')/db:refentry/db:refsect1[@role='description']/descendant::db:constructorsynopsis[@role='Exception'])">
<xi:fallback/>
</xi:include>
<xi:include xpointer="xmlns(db=http://docbook.org/ns/docbook) xpointer(id('class.exception')/db:refentry/db:refsect1[@role='description']/descendant::db:methodsynopsis[@role='Exception'])">
<xi:fallback/>
</xi:include>
</classsynopsis>
<!-- }}} -->
</section>
</partintro>
</phpdoc:exceptionref>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->

View File

@@ -0,0 +1,72 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 696b6b9e32d8d4ef4cfd874caf677a47a6cbadb4 Maintainer: leonardolara Status: ready --><!-- CREDITS: leonardolara -->
<phpdoc:exceptionref xml:id="class.datemalformedintervalstringexception" xmlns:phpdoc="http://php.net/ns/phpdoc" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xi="http://www.w3.org/2001/XInclude">
<title>The DateMalformedIntervalStringException class</title>
<titleabbrev>DateMalformedIntervalStringException</titleabbrev>
<partintro>
<!-- {{{ DateMalformedIntervalStringException intro -->
<section xml:id="datemalformedintervalstringexception.intro">
&reftitle.intro;
<para>
Disparada quando um argumento <parameter>duration</parameter> inválido é passado para
<methodname>DateInterval::__construct</methodname>.
</para>
</section>
<!-- }}} -->
<section xml:id="datemalformedintervalstringexception.synopsis">
&reftitle.classsynopsis;
<!-- {{{ Synopsis -->
<classsynopsis class="class">
<ooexception>
<exceptionname>DateMalformedIntervalStringException</exceptionname>
</ooexception>
<ooclass>
<modifier>extends</modifier>
<classname>DateException</classname>
</ooclass>
<classsynopsisinfo role="comment">&InheritedProperties;</classsynopsisinfo>
<xi:include xpointer="xmlns(db=http://docbook.org/ns/docbook) xpointer(id('class.exception')/db:partintro/db:section/db:classsynopsis/db:fieldsynopsis[preceding-sibling::db:classsynopsisinfo[1][@role='comment' and text()='&Properties;']]))">
<xi:fallback/>
</xi:include>
<classsynopsisinfo role="comment">&InheritedMethods;</classsynopsisinfo>
<xi:include xpointer="xmlns(db=http://docbook.org/ns/docbook) xpointer(id('class.exception')/db:refentry/db:refsect1[@role='description']/descendant::db:constructorsynopsis[@role='Exception'])">
<xi:fallback/>
</xi:include>
<xi:include xpointer="xmlns(db=http://docbook.org/ns/docbook) xpointer(id('class.exception')/db:refentry/db:refsect1[@role='description']/descendant::db:methodsynopsis[@role='Exception'])">
<xi:fallback/>
</xi:include>
</classsynopsis>
<!-- }}} -->
</section>
</partintro>
</phpdoc:exceptionref>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->

View File

@@ -0,0 +1,72 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 696b6b9e32d8d4ef4cfd874caf677a47a6cbadb4 Maintainer: leonardolara Status: ready --><!-- CREDITS: leonardolara -->
<phpdoc:exceptionref xml:id="class.datemalformedperiodstringexception" xmlns:phpdoc="http://php.net/ns/phpdoc" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xi="http://www.w3.org/2001/XInclude">
<title>A classe DateMalformedPeriodStringException</title>
<titleabbrev>DateMalformedPeriodStringException</titleabbrev>
<partintro>
<!-- {{{ DateMalformedPeriodStringException intro -->
<section xml:id="datemalformedperiodstringexception.intro">
&reftitle.intro;
<para>
Disparaqa quando um argumento <parameter>isostr</parameter> inválido é passado para
<methodname>DatePeriod::__construct</methodname>.
</para>
</section>
<!-- }}} -->
<section xml:id="datemalformedperiodstringexception.synopsis">
&reftitle.classsynopsis;
<!-- {{{ Synopsis -->
<classsynopsis class="class">
<ooexception>
<exceptionname>DateMalformedPeriodStringException</exceptionname>
</ooexception>
<ooclass>
<modifier>extends</modifier>
<classname>DateException</classname>
</ooclass>
<classsynopsisinfo role="comment">&InheritedProperties;</classsynopsisinfo>
<xi:include xpointer="xmlns(db=http://docbook.org/ns/docbook) xpointer(id('class.exception')/db:partintro/db:section/db:classsynopsis/db:fieldsynopsis[preceding-sibling::db:classsynopsisinfo[1][@role='comment' and text()='&Properties;']]))">
<xi:fallback/>
</xi:include>
<classsynopsisinfo role="comment">&InheritedMethods;</classsynopsisinfo>
<xi:include xpointer="xmlns(db=http://docbook.org/ns/docbook) xpointer(id('class.exception')/db:refentry/db:refsect1[@role='description']/descendant::db:constructorsynopsis[@role='Exception'])">
<xi:fallback/>
</xi:include>
<xi:include xpointer="xmlns(db=http://docbook.org/ns/docbook) xpointer(id('class.exception')/db:refentry/db:refsect1[@role='description']/descendant::db:methodsynopsis[@role='Exception'])">
<xi:fallback/>
</xi:include>
</classsynopsis>
<!-- }}} -->
</section>
</partintro>
</phpdoc:exceptionref>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->

View File

@@ -0,0 +1,77 @@
<?xml version="1.0" encoding="utf-8"?>
<phpdoc:exceptionref xml:id="class.datemalformedstringexception" xmlns:phpdoc="http://php.net/ns/phpdoc" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xi="http://www.w3.org/2001/XInclude">
<title>A classe DateMalformedStringException</title>
<titleabbrev>DateMalformedStringException</titleabbrev>
<partintro>
<!-- {{{ DateMalformedStringException intro -->
<section xml:id="datemalformedstringexception.intro">
&reftitle.intro;
<para>
Disparada quando uma string inválida de Data/Hora é detectada.
</para>
<para>
Pode ser um valor para
<methodname>DateTimeImmutable::__construct</methodname>,
<methodname>DateTimeImmutable::modify</methodname>,
<methodname>DateTime::__construct</methodname> ou
<methodname>DateTime::modify</methodname>.
</para>
</section>
<!-- }}} -->
<section xml:id="datemalformedstringexception.synopsis">
&reftitle.classsynopsis;
<!-- {{{ Synopsis -->
<classsynopsis class="class">
<ooexception>
<exceptionname>DateMalformedStringException</exceptionname>
</ooexception>
<ooclass>
<modifier>extends</modifier>
<classname>DateException</classname>
</ooclass>
<classsynopsisinfo role="comment">&InheritedProperties;</classsynopsisinfo>
<xi:include xpointer="xmlns(db=http://docbook.org/ns/docbook) xpointer(id('class.exception')/db:partintro/db:section/db:classsynopsis/db:fieldsynopsis[preceding-sibling::db:classsynopsisinfo[1][@role='comment' and text()='&Properties;']]))">
<xi:fallback/>
</xi:include>
<classsynopsisinfo role="comment">&InheritedMethods;</classsynopsisinfo>
<xi:include xpointer="xmlns(db=http://docbook.org/ns/docbook) xpointer(id('class.exception')/db:refentry/db:refsect1[@role='description']/descendant::db:constructorsynopsis[@role='Exception'])">
<xi:fallback/>
</xi:include>
<xi:include xpointer="xmlns(db=http://docbook.org/ns/docbook) xpointer(id('class.exception')/db:refentry/db:refsect1[@role='description']/descendant::db:methodsynopsis[@role='Exception'])">
<xi:fallback/>
</xi:include>
</classsynopsis>
<!-- }}} -->
</section>
</partintro>
</phpdoc:exceptionref>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->

View File

@@ -0,0 +1,85 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 696b6b9e32d8d4ef4cfd874caf677a47a6cbadb4 Maintainer: leonardolara Status: ready --><!-- CREDITS: leonardolara -->
<phpdoc:exceptionref xml:id="class.dateobjecterror" xmlns:phpdoc="http://php.net/ns/phpdoc" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xi="http://www.w3.org/2001/XInclude">
<title>A classe DateObjectError</title>
<titleabbrev>DateObjectError</titleabbrev>
<partintro>
<!-- {{{ DateObjectError intro -->
<section xml:id="dateobjecterror.intro">
&reftitle.intro;
<para>
Disparada quando uma das classe de Data/Hora não foi corretamente
inicializada.
</para>
<para>
Como as classes de Data/Hora não são finais, eles podem ser herdadas.
Quando um construtor da classe pai não é chamado, este erro é disparado. Este é
sempre um erro de programação.
</para>
</section>
<!-- }}} -->
<section xml:id="dateobjecterror.synopsis">
&reftitle.classsynopsis;
<!-- {{{ Synopsis -->
<classsynopsis class="class">
<ooexception>
<exceptionname>DateObjectError</exceptionname>
</ooexception>
<ooclass>
<modifier>extends</modifier>
<classname>DateError</classname>
</ooclass>
<classsynopsisinfo role="comment">&InheritedProperties;</classsynopsisinfo>
<xi:include xpointer="xmlns(db=http://docbook.org/ns/docbook) xpointer(id('class.error')/db:partintro/db:section/db:classsynopsis/db:fieldsynopsis[preceding-sibling::db:classsynopsisinfo[1][@role='comment' and text()='&Properties;']]))">
<xi:fallback/>
</xi:include>
<classsynopsisinfo role="comment">&InheritedMethods;</classsynopsisinfo>
<xi:include xpointer="xmlns(db=http://docbook.org/ns/docbook) xpointer(id('class.error')/db:refentry/db:refsect1[@role='description']/descendant::db:constructorsynopsis[@role='Error'])">
<xi:fallback/>
</xi:include>
<xi:include xpointer="xmlns(db=http://docbook.org/ns/docbook) xpointer(id('class.error')/db:refentry/db:refsect1[@role='description']/descendant::db:methodsynopsis[@role='Error'])">
<xi:fallback/>
</xi:include>
</classsynopsis>
<!-- }}} -->
</section>
<section role="seealso">
&reftitle.seealso;
<simplelist>
<member><exceptionname>DateError</exceptionname></member>
<member><exceptionname>DateRangeError</exceptionname></member>
</simplelist>
</section>
</partintro>
</phpdoc:exceptionref>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->

View File

@@ -0,0 +1,171 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 0070ddc45d60b6eda095053847dba544aa4339bf Maintainer: leonardolara Status: ready --><!-- CREDITS: leonardolara -->
<refentry xml:id="dateperiod.createfromiso8601string" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<refnamediv>
<refname>DatePeriod::createFromISO8601String</refname>
<refpurpose>Cria um novo objeto DatePeriod a partir de uma string ISO8601</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis role="DatePeriod">
<modifier>public</modifier> <modifier>static</modifier> <type>static</type><methodname>DatePeriod::createFromISO8601String</methodname>
<methodparam><type>string</type><parameter>specification</parameter></methodparam>
<methodparam choice="opt"><type>int</type><parameter>options</parameter><initializer>0</initializer></methodparam>
</methodsynopsis>
<para>
Cria um novo objeto DatePeriod a partir de uma string ISO8601, como especificado no parâmetro
<parameter>specification</parameter>.
</para>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<variablelist>
<varlistentry>
<term><parameter>specification</parameter></term>
<listitem>
<para>
Um subconjunto da <link xlink:href="&url.iso-8601.repeating_intervals;">especificação ISO 8601
de intervalos repetitivos</link>.
</para>
<para>
Um exemplo de uma especificação de intervalo ISO 8601 aceitável é
<literal>R5/2008-03-01T13:00:00Z/P1Y2M10DT2H30M</literal>, que
especifica:
</para>
<itemizedlist>
<listitem>
<simpara>
5 iterações (<literal>R5/</literal>)
</simpara>
</listitem>
<listitem>
<simpara>
Inicia em <literal>2008-03-01T13:00:00Z</literal>.
</simpara>
</listitem>
<listitem>
<simpara>
Cada iteração ocorrem em um intervalo de 1 ano, 2 meses, 10 dias, 2 horas e 30 minutos
(<literal>/P1Y2M10DT2H30M</literal>).
</simpara>
</listitem>
</itemizedlist>
<para>
Exemplo de recursos de especificação de intervalos ISO 8601 que o PHP
não suporta são:
</para>
<orderedlist>
<listitem>
<simpara>
zero ocorrências (<literal>R0/</literal>)
</simpara>
</listitem>
<listitem>
<simpara>
deslocamento de fuso horário que não seja UTC (<literal>Z</literal>), como em <literal>+02:00</literal>.
</simpara>
</listitem>
</orderedlist>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>options</parameter></term>
<listitem>
<para>
Um campo de bits que pode ser utilizado para controlar certos comportamentos com datas iniciais
e finais.
</para>
<para>
Com <constant>DatePeriod::EXCLUDE_START_DATE</constant>, pode-se
excluir a data inicial do conjunto de datas recorrentes dentro do
período.
</para>
<para>
Com <constant>DatePeriod::INCLUDE_END_DATE</constant>, pode-se
incluir a data final no conjunto de datas recorrentes dentro do
período.
</para>
</listitem>
</varlistentry>
</variablelist>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
Retorna um novo objeto DatePeriod.
</para>
<para>
Objetos <classname>DatePeriod</classname> criados com este método podem ser
usador como um iterador para gerar um número de
objetos <classname>DateTimeImmutable</classname>.
</para>
</refsect1>
<refsect1 role="errors">
&reftitle.errors;
<para>
Dispara <classname>DateMalformedPeriodStringException</classname> quando
o parâmetro <parameter>specification</parameter> não puder ser analisado como um período ISO 8601
válido.
</para>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<para>
<example>
<title>Exemplo de DatePeriod::createFromISO8601String</title>
<programlisting role="php">
<![CDATA[
<?php
$iso = 'R4/2023-07-01T00:00:00Z/P7D';
$period = DatePeriod::createFromISO8601String($iso);
// Iterando pelo objeto DatePeriod, todas as
// datas recorrentes dentro do período são exibidas.
foreach ($period as $date) {
echo $date->format('Y-m-d'), "\n";
}
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
2023-07-01
2023-07-08
2023-07-15
2023-07-22
2023-07-29
]]>
</screen>
</example>
</para>
</refsect1>
</refentry>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->

View File

@@ -0,0 +1,86 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 02ff7fef5b34cf8f5395180d9d39fb64d9398d00 Maintainer: leonardolara Status: ready --><!-- CREDITS: leonardolara -->
<refentry xml:id="dateperiod.getdateinterval" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<refnamediv>
<refname>DatePeriod::getDateInterval</refname>
<refpurpose>
Obtém o intervalo
</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<para>&style.oop;</para>
<methodsynopsis role="DatePeriod">
<modifier>public</modifier> <type>DateInterval</type><methodname>DatePeriod::getDateInterval</methodname>
<void/>
</methodsynopsis>
<para>
Obtém um <type>object</type> da classe <classname>DateInterval</classname>
representando o intervalo usado para o período.
</para>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
&no.function.parameters;
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
Retorna um <type>object</type> <classname>DateInterval</classname>.
</para>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<example>
<title>Exemplo de <methodname>DatePeriod::getDateInterval</methodname></title>
<programlisting role="php">
<![CDATA[
<?php
$period = new DatePeriod('R7/2016-05-16T00:00:00Z/P1D');
$interval = $period->getDateInterval();
echo $interval->format('%d day');
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
1 day
]]>
</screen>
</example>
</refsect1>
<refsect1 role="seealso">
&reftitle.seealso;
<simplelist>
<member><methodname>DatePeriod::getStartDate</methodname></member>
<member><methodname>DatePeriod::getEndDate</methodname></member>
</simplelist>
</refsect1>
</refentry>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->

View File

@@ -0,0 +1,124 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 02ff7fef5b34cf8f5395180d9d39fb64d9398d00 Maintainer: leonardolara Status: ready --><!-- CREDITS: leonardolara -->
<refentry xml:id="dateperiod.getenddate" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<refnamediv>
<refname>DatePeriod::getEndDate</refname>
<refpurpose>
Obtém a data final
</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<para>&style.oop;</para>
<methodsynopsis role="DatePeriod">
<modifier>public</modifier> <type class="union"><type>DateTimeInterface</type><type>null</type></type><methodname>DatePeriod::getEndDate</methodname>
<void/>
</methodsynopsis>
<para>
Obtém a data final do período.
</para>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
&no.function.parameters;
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
Retorna &null; se o <classname>DatePeriod</classname>
não tiver uma data final. Por exemplo, quando inicializado com o
parâmetro <parameter>recurrences</parameter> ou
<parameter>isostr</parameter> sem uma
data final.
</para>
<para>
Retorna um <type>object</type> <classname>DateTimeImmutable</classname>
quando o <classname>DatePeriod</classname> é inicializado com um
<type>object</type> <classname>DateTimeImmutable</classname>
no parâmetro <parameter>end</parameter>.
</para>
<para>
Caso contrário, retorna um clone do <type>object</type> <classname>DateTime</classname>
representando a data final.
</para>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<example>
<title>Exemplo de <methodname>DatePeriod::getEndDate</methodname></title>
<programlisting role="php">
<![CDATA[
<?php
$period = new DatePeriod(
new DateTime('2016-05-16T00:00:00Z'),
new DateInterval('P1D'),
new DateTime('2016-05-20T00:00:00Z')
);
$start = $period->getEndDate();
echo $start->format(DateTime::ISO8601);
?>
]]>
</programlisting>
&examples.outputs;
<screen>
<![CDATA[
2016-05-20T00:00:00+0000
]]>
</screen>
</example>
<example>
<title>Exemplo de <methodname>DatePeriod::getEndDate</methodname> sem uma data final</title>
<programlisting role="php">
<![CDATA[
<?php
$period = new DatePeriod(
new DateTime('2016-05-16T00:00:00Z'),
new DateInterval('P1D'),
7
);
var_dump($period->getEndDate());
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
NULL
]]>
</screen>
</example>
</refsect1>
<refsect1 role="seealso">
&reftitle.seealso;
<simplelist>
<member><methodname>DatePeriod::getStartDate</methodname></member>
<member><methodname>DatePeriod::getDateInterval</methodname></member>
</simplelist>
</refsect1>
</refentry>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->

View File

@@ -0,0 +1,105 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 02ff7fef5b34cf8f5395180d9d39fb64d9398d00 Maintainer: leonardolara Status: ready --><!-- CREDITS: leonardolara -->
<refentry xml:id="dateperiod.getrecurrences" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<refnamediv>
<refname>DatePeriod::getRecurrences</refname>
<refpurpose>Obtém o número de recorrências</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<para>&style.oop;</para>
<methodsynopsis role="DatePeriod">
<modifier>public</modifier> <type class="union"><type>int</type><type>null</type></type><methodname>DatePeriod::getRecurrences</methodname>
<void/>
</methodsynopsis>
<para>
Obtém Obtém o número de recorrências.
</para>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
&no.function.parameters;
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
O número de recorrências como definido explicitamente pelo parâmetro
<literal>$recurrences</literal> passado ao contrutor da
classe <classname>DatePeriod</classname>, ou &null; caso não tenha sido definido.
</para>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<para>
<example>
<title>Diferentes valores para <methodname>DatePeriod::getRecurrences</methodname></title>
<programlisting role="php">
<![CDATA[<?php
$start = new DateTime('2018-12-31 00:00:00');
$end = new DateTime('2021-12-31 00:00:00');
$interval = new DateInterval('P1M');
$recurrences = 5;
// recorrências definidas explicitamente através do construtor
$period = new DatePeriod($start, $interval, $recurrences, DatePeriod::EXCLUDE_START_DATE);
echo $period->getRecurrences(), "\n";
$period = new DatePeriod($start, $interval, $recurrences);
echo $period->getRecurrences(), "\n";
$period = new DatePeriod($start, $interval, $recurrences, DatePeriod::INCLUDE_END_DATE);
echo $period->getRecurrences(), "\n\n";
// recorrências não definidas no construtor
$period = new DatePeriod($start, $interval, $end);
var_dump($period->getRecurrences());
$period = new DatePeriod($start, $interval, $end, DatePeriod::EXCLUDE_START_DATE);
var_dump($period->getRecurrences());
?>]]>
</programlisting>
&example.outputs;
<screen role="php">
5
5
5
NULL
NULL
</screen>
</example>
</para>
</refsect1>
<refsect1 role="seealso">
&reftitle.seealso;
<simplelist>
<member><link linkend="dateperiod.props.recurrences">DatePeriod::$recurrences</link></member>
</simplelist>
</refsect1>
</refentry>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->

View File

@@ -0,0 +1,92 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 02ff7fef5b34cf8f5395180d9d39fb64d9398d00 Maintainer: leonardolara Status: ready --><!-- CREDITS: leonardolara -->
<refentry xml:id="dateperiod.getstartdate" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<refnamediv>
<refname>DatePeriod::getStartDate</refname>
<refpurpose>
Obtém a data inicial
</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<para>&style.oop;</para>
<methodsynopsis role="DatePeriod">
<modifier>public</modifier> <type>DateTimeInterface</type><methodname>DatePeriod::getStartDate</methodname>
<void/>
</methodsynopsis>
<para>
Obtém a data inicial do período.
</para>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
&no.function.parameters;
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
Retorna um <type>object</type> <classname>DateTimeImmutable</classname>
quando o <classname>DatePeriod</classname> é inicializado com um
<type>object</type> <classname>DateTimeImmutable</classname>
no parâmetro <parameter>start</parameter>.
</para>
<para>
Caso contrário, retorna um <type>object</type>
<classname>DateTime</classname>.
</para>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<example>
<title>Exemplo de <methodname>DatePeriod::getStartDate</methodname></title>
<programlisting role="php">
<![CDATA[
<?php
$period = new DatePeriod('R7/2016-05-16T00:00:00Z/P1D');
$start = $period->getStartDate();
echo $start->format(DateTime::ISO8601);
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
2016-05-16T00:00:00+0000
]]>
</screen>
</example>
</refsect1>
<refsect1 role="seealso">
&reftitle.seealso;
<simplelist>
<member><methodname>DatePeriod::getEndDate</methodname></member>
<member><methodname>DatePeriod::getDateInterval</methodname></member>
</simplelist>
</refsect1>
</refentry>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->

View File

@@ -0,0 +1,82 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 696b6b9e32d8d4ef4cfd874caf677a47a6cbadb4 Maintainer: leonardolara Status: ready --><!-- CREDITS: leonardolara -->
<phpdoc:exceptionref xml:id="class.daterangeerror" xmlns:phpdoc="http://php.net/ns/phpdoc" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xi="http://www.w3.org/2001/XInclude">
<title>A classe DateRangeError</title>
<titleabbrev>DateRangeError</titleabbrev>
<partintro>
<!-- {{{ DateRangeError intro -->
<section xml:id="daterangeerror.intro">
&reftitle.intro;
<para>
Disparada por <methodname>DateTime::getTimestamp</methodname>,
<methodname>DateTimeImmutable::getTimestamp</methodname> e
<function>date_timestamp_get</function>em plataformas de 32 bits se o
objeto representa uma data fora da faixa de inteiros de 32 bits com sinal.
</para>
</section>
<!-- }}} -->
<section xml:id="daterangeerror.synopsis">
&reftitle.classsynopsis;
<!-- {{{ Synopsis -->
<classsynopsis class="class">
<ooexception>
<exceptionname>DateRangeError</exceptionname>
</ooexception>
<ooclass>
<modifier>extends</modifier>
<classname>DateError</classname>
</ooclass>
<classsynopsisinfo role="comment">&InheritedProperties;</classsynopsisinfo>
<xi:include xpointer="xmlns(db=http://docbook.org/ns/docbook) xpointer(id('class.error')/db:partintro/db:section/db:classsynopsis/db:fieldsynopsis[preceding-sibling::db:classsynopsisinfo[1][@role='comment' and text()='&Properties;']]))">
<xi:fallback/>
</xi:include>
<classsynopsisinfo role="comment">&InheritedMethods;</classsynopsisinfo>
<xi:include xpointer="xmlns(db=http://docbook.org/ns/docbook) xpointer(id('class.error')/db:refentry/db:refsect1[@role='description']/descendant::db:constructorsynopsis[@role='Error'])">
<xi:fallback/>
</xi:include>
<xi:include xpointer="xmlns(db=http://docbook.org/ns/docbook) xpointer(id('class.error')/db:refentry/db:refsect1[@role='description']/descendant::db:methodsynopsis[@role='Error'])">
<xi:fallback/>
</xi:include>
</classsynopsis>
<!-- }}} -->
</section>
<section role="seealso">
&reftitle.seealso;
<simplelist>
<member><exceptionname>DateError</exceptionname></member>
<member><exceptionname>DateObjectError</exceptionname></member>
</simplelist>
</section>
</partintro>
</phpdoc:exceptionref>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->

View File

@@ -14,7 +14,7 @@
Representação de data e hora.
</para>
<para>
Esta classe se comporta da mesma maneira que a classe<classname>DateTimeImmutable</classname>,
Esta classe se comporta da mesma maneira que a classe <classname>DateTimeImmutable</classname>,
exceto pelo fato de que os objetos se alteram quando métodos de modificação como
<function>DateTime::modify</function> são chamados.
</para>

View File

@@ -25,7 +25,7 @@
<para>
Adiciona o objeto <classname>DateInterval</classname> informado a um objeto
DateTime especificado.
<classname>DateTime</classname> especificado.
</para>
<para>
Equivalente a <methodname>DateTimeImmutable::add</methodname> mas funciona com

View File

@@ -0,0 +1,106 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 02ff7fef5b34cf8f5395180d9d39fb64d9398d00 Maintainer: leonardolara Status: ready --><!-- CREDITS: leonardolara -->
<refentry xml:id="datetime.createfromimmutable" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<refnamediv>
<refname>DateTime::createFromImmutable</refname>
<refpurpose>Retorna uma nova instância de DateTime encapsulando o objeto DateTimeImmutable informado</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis role="DateTime">
<modifier>public</modifier> <modifier>static</modifier> <type>static</type><methodname>DateTime::createFromImmutable</methodname>
<methodparam><type>DateTimeImmutable</type><parameter>object</parameter></methodparam>
</methodsynopsis>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<para>
<variablelist>
<varlistentry>
<term><parameter>object</parameter></term>
<listitem>
<para>
O objeto imutável <classname>DateTimeImmutable</classname> que necessita
ser convertido para uma versão mutável. Este objeto não é modificado, em
vez disso uma nova instância <classname>DateTime</classname> é
criada contendo as mesmas informações de data, horário e fuso.
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
Retorna uma nova instância <classname>DateTime</classname>.
</para>
</refsect1>
<refsect1 role="changelog">
&reftitle.changelog;
<para>
<informaltable>
<tgroup cols="2">
<thead>
<row>
<entry>&Version;</entry>
<entry>&Description;</entry>
</row>
</thead>
<tbody>
<row>
<entry>8.0.0</entry>
<entry>
O método agora retorna uma instância da classe que está sendo chamada. Anteriormente, ele criava
uma nova instância de <classname>DateTime</classname>.
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</para>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<para>
<example>
<title>Criando um objeto de data/hora mutável</title>
<programlisting role="php">
<![CDATA[
<?php
$date = new DateTimeImmutable("2014-06-20 11:45 Europe/London");
$mutable = DateTime::createFromImmutable( $date );
?>
]]>
</programlisting>
</example>
</para>
</refsect1>
</refentry>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->

View File

@@ -0,0 +1,83 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 02ff7fef5b34cf8f5395180d9d39fb64d9398d00 Maintainer: leonardolara Status: ready --><!-- CREDITS: leonardolara -->
<refentry xml:id="datetime.createfrominterface" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<refnamediv>
<refname>DateTime::createFromInterface</refname>
<refpurpose>Retorna um novo objeto DateTime encapsulando o objeto DateTimeInterface informado</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis role="DateTime">
<modifier>public</modifier> <modifier>static</modifier> <type>DateTime</type><methodname>DateTime::createFromInterface</methodname>
<methodparam><type>DateTimeInterface</type><parameter>object</parameter></methodparam>
</methodsynopsis>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<para>
<variablelist>
<varlistentry>
<term><parameter>object</parameter></term>
<listitem>
<para>
O objeto <classname>DateTimeInterface</classname> que necessita
ser convertido para uma versão mutável. Este objeto não é modificado, em
vez disso uma nova instância <classname>DateTime</classname> é
criada contendo as mesmas informações de data, horário e fuso.
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
Retorna uma nova instância de <classname>DateTime</classname>.
</para>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<para>
<example>
<title>Criando um objeto de data/hora mutável</title>
<programlisting role="php">
<![CDATA[
<?php
$date = new DateTimeImmutable("2014-06-20 11:45 Europe/London");
$mutable = DateTime::createFromInterface($date);
$date = new DateTime("2014-06-20 11:45 Europe/London");
$also_mutable = DateTime::createFromInterface($date);
?>
]]>
</programlisting>
</example>
</para>
</refsect1>
</refentry>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->

View File

@@ -21,7 +21,7 @@
<methodparam><type>DateTimeZone</type><parameter>timezone</parameter></methodparam>
</methodsynopsis>
<para>
Define um novo fuso horário a um <type>objeto</type> <classname>DateTime</classname>.
Define um novo fuso horário a um objeto <classname>DateTime</classname>.
</para>
<para>
Equivalente a <methodname>DateTimeImmutable::setTimezone</methodname> mas funciona com

View File

@@ -0,0 +1,83 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 02ff7fef5b34cf8f5395180d9d39fb64d9398d00 Maintainer: leonardolara Status: ready --><!-- CREDITS: leonardolara -->
<refentry xml:id="datetimeimmutable.createfrominterface" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<refnamediv>
<refname>DateTimeImmutable::createFromInterface</refname>
<refpurpose>Retorna um novo objeto DateTimeImmutable encapsulando o objeto DateTimeInterface informado</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis role="DateTimeImmutable">
<modifier>public</modifier> <modifier>static</modifier> <type>DateTimeImmutable</type><methodname>DateTimeImmutable::createFromInterface</methodname>
<methodparam><type>DateTimeInterface</type><parameter>object</parameter></methodparam>
</methodsynopsis>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<para>
<variablelist>
<varlistentry>
<term><parameter>object</parameter></term>
<listitem>
<para>
O objeto <classname>DateTimeInterface</classname> que necessita
ser convertido para uma versão mutável. Este objeto não é modificado, em
vez disso uma nova instância <classname>DateTimeImmutable</classname> é
criada contendo as mesmas informações de data, horário e fuso.
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
Retorna uma nova instância de <classname>DateTimeImmutable</classname>.
</para>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<para>
<example>
<title>Criando um objeto de data/hora imutável</title>
<programlisting role="php">
<![CDATA[
<?php
$date = new DateTime("2014-06-20 11:45 Europe/London");
$immutable = DateTimeImmutable::createFromInterface($date);
$date = new DateTimeImmutable("2014-06-20 11:45 Europe/London");
$also_immutable = DateTimeImmutable::createFromInterface($date);
?>
]]>
</programlisting>
</example>
</para>
</refsect1>
</refentry>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->

View File

@@ -0,0 +1,158 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 8cdc6621f9826d04abc3e50438c010804d7e8683 Maintainer: leonardolara Status: ready --><!-- CREDITS: leonardolara -->
<chapter xml:id="datetime.examples" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
&reftitle.examples;
<section xml:id="datetime.examples-arithmetic">
<title>Aritmética de Data e Horário</title>
<para>
Os exemplos a seguir mostram algumas armadilhas da aritmética de Data/Horário em
relação a transições de horário de verão e meses que contêm números diferentes de dias.
</para>
<para>
<example>
<title>DateTimeImmutable::add/sub adicionando intervalos que tempo decorrido</title>
<simpara>
Adicionar PT24H sobre uma transição de horário de verão irá aparentar uma adição de
23/25 horas (para a maioria dos fusos horários).
</simpara>
<programlisting role="php">
<![CDATA[
<?php
$dt = new DateTimeImmutable("2015-11-01 00:00:00", new DateTimeZone("America/New_York"));
echo "Start: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
$dt = $dt->add(new DateInterval("PT3H"));
echo "End: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Start: 2015-11-01 00:00:00 -04:00
End: 2015-11-01 02:00:00 -05:00
]]>
</screen>
</example>
</para>
<para>
<example>
<title>DateTimeImmutable::modify e strtotime incrementando ou decrementando valores de componentes individuais</title>
<simpara>
Adicionar +24 horas sobre uma transição de horário de verão irá adicionar exatamente 24 horas como visto na
string de data/hora (a menos que o horário de início ou fim esteja em um ponto
de transição).
</simpara>
<programlisting role="php">
<![CDATA[
<?php
$dt = new DateTimeImmutable("2015-11-01 00:00:00", new DateTimeZone("America/New_York"));
echo "Start: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
$dt = $dt->modify("+24 hours");
echo "End: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Start: 2015-11-01 00:00:00 -04:00
End: 2015-11-02 00:00:00 -05:00
]]>
</screen>
</example>
</para>
<para>
<example>
<title>Adicionar ou substrair períodos pode causar transferência de datas</title>
<simpara>
Como em 31 de janeiro + 1 mês, irá resultar em 2 de março (em ano bissexto) ou
3 de março (em ano normal).
</simpara>
<programlisting role="php">
<![CDATA[
<?php
echo "Ano normal:\n"; // fevereiro tem 28 dias
$dt = new DateTimeImmutable("2015-01-31 00:00:00", new DateTimeZone("America/New_York"));
echo "Início: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
$dt = $dt->modify("+1 month");
echo "Fim: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
echo "Ano bissexto:\n"; // fevereiro tem 29 dias
$dt = new DateTimeImmutable("2016-01-31 00:00:00", new DateTimeZone("America/New_York"));
echo "Início: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
$dt = $dt->modify("+1 month");
echo "Fim: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Ano normal:
Início: 2015-01-31 00:00:00 -05:00
Fim: 2015-03-03 00:00:00 -05:00
Ano bissexto:
Início: 2016-01-31 00:00:00 -05:00
Fim: 2016-03-02 00:00:00 -05:00
]]>
</screen>
<simpara>
PAra obter o último dia do mês seguinte (para evitar a transferência),
o formato <literal>last day of</literal> está disponível.
</simpara>
<programlisting role="php">
<![CDATA[
<?php
echo "Ano normal:\n"; // fevereiro tem 28 dias
$dt = new DateTimeImmutable("2015-01-31 00:00:00", new DateTimeZone("America/New_York"));
echo "Início: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
$dt = $dt->modify("last day of next month");
echo "Fim: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
echo "Ano bissexto:\n"; // fevereiro tem 29 dias
$dt = new DateTimeImmutable("2016-01-31 00:00:00", new DateTimeZone("America/New_York"));
echo "Início: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
$dt = $dt->modify("last day of next month");
echo "Fim: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Normal year:
Start: 2015-01-31 00:00:00 -05:00
End: 2015-02-28 00:00:00 -05:00
Leap year:
Start: 2016-01-31 00:00:00 -05:00
End: 2016-02-29 00:00:00 -05:00
]]>
</screen>
</example>
</para>
</section>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->

View File

@@ -174,7 +174,7 @@ object(DateTimeImmutable)#1 (3) {
<entry>"04", "07", "19"</entry>
</row>
<row>
<entry><literal>meridiano</literal></entry>
<entry><literal>meridian</literal></entry>
<entry>[AaPp] .? [Mm] .? [\0\t ]</entry>
<entry>"A.m.", "pM", "am."</entry>
</row>

View File

@@ -3,7 +3,7 @@
<refentry xml:id="function.checkdate" xmlns="http://docbook.org/ns/docbook">
<refnamediv>
<refname>checkdate</refname>
<refpurpose>Valida uma data Gregoriana</refpurpose>
<refpurpose>Valida uma data gregoriana</refpurpose>
</refnamediv>
<refsect1 role="description">
@@ -15,7 +15,7 @@
<methodparam><type>int</type><parameter>year</parameter></methodparam>
</methodsynopsis>
<para>
Checa a validade da data formada pelos argumentos. Uma data é considerada
Verifica a validade da data formada pelos argumentos. Uma data é considerada
válida se cada parâmetro é adequadamente definido.
</para>
</refsect1>
@@ -36,8 +36,8 @@
<term><parameter>day</parameter></term>
<listitem>
<para>
O dia está dentro do número permitido de dias para um
<parameter>month</parameter>. <parameter>year</parameter>s bissextos são
O dia está dentro do número permitido de dias para o mês
(<parameter>month</parameter>). Anos (<parameter>year</parameter>) bissextos são
levados em consideração.
</para>
</listitem>
@@ -46,7 +46,7 @@
<term><parameter>year</parameter></term>
<listitem>
<para>
O ano está entre 1 e 32767, incluso.
O ano está entre 1 e 32767, inclusive.
</para>
</listitem>
</varlistentry>

View File

@@ -48,7 +48,7 @@
&reftitle.returnvalues;
<para>
A função retorna &false; se o
<parameter>timezone_identifier</parameter> não for válido, ou &true;
<parameter>timezoneId</parameter> não for válido, ou &true;
caso contrário.
</para>
</refsect1>

View File

@@ -227,6 +227,23 @@ echo date("D M d Y"). ', horário do nascer do sol : ' .date_sunrise(time(), SUN
<screen>
<![CDATA[
Mon Dec 20 2004, horário do nascer do sol : 08:54
]]>
</screen>
</example>
<example>
<title>Sem nascer do sol</title>
<programlisting role="php">
<![CDATA[
<?php
$solstice = strtotime('2017-12-21');
var_dump(date_sunrise($solstice, SUNFUNCS_RET_STRING, 69.245833, -53.537222));
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
bool(false)
]]>
</screen>
</example>

View File

@@ -30,7 +30,7 @@
<methodparam choice="opt"><type class="union"><type>float</type><type>null</type></type><parameter>utcOffset</parameter><initializer>&null;</initializer></methodparam>
</methodsynopsis>
<para>
A função <function>date_sunrise</function> retorna o horário do pôr do sol para um
A função <function>date_sunset</function> retorna o horário do pôr do sol para um
dia (especificado como um <parameter>timestamp</parameter>) e uma localização informados.
</para>
</refsect1>

View File

@@ -14,7 +14,7 @@
<methodparam choice="opt"><type class="union"><type>int</type><type>null</type></type><parameter>timestamp</parameter><initializer>&null;</initializer></methodparam>
</methodsynopsis>
<para>
Idêntica a função <function>date</function>, exceto que
Idêntica à função <function>date</function>, exceto que
a hora retornada será baseada no Horário de Greenwich (GMT).
</para>
</refsect1>

View File

@@ -184,6 +184,16 @@ Array
</example>
</para>
</refsect1>
<refsect1 role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member><function>getdate</function></member>
</simplelist>
</para>
</refsect1>
</refentry>
<!-- Keep this comment at the end of the file
Local variables:

View File

@@ -33,7 +33,7 @@
Além disso, nem todas as plataformas suportam timestamps negativos, então sua
faixa de datas pode ficar limitada a um valor não anterior à época Unix. Isto significa que
%e, %T, %R e %D (e possivelmente outras) - assim como datas anteriores a
<literal>Jan 1, 1970</literal> - não funcionarão no Windows, algumas distribuições
<literal>1 de janeito de 1970</literal> - não funcionarão no Windows, algumas distribuições
Linux, e alguns outros sistemas operacionais. Para sistemas Windows, uma visão
completa dos especificadores de conversão suportados podem ser encontrados em
<link xlink:href="&url.strftime.win32;"><acronym>MSDN</acronym></link>.
@@ -140,7 +140,7 @@
<row>
<entry><literal>%b</literal></entry>
<entry>Nome do mês abreviado, baseado no idioma</entry>
<entry><literal>Jan</literal> até <literal>Dez</literal></entry>
<entry><literal>jan</literal> até <literal>dez</literal></entry>
</row>
<row>
<entry><literal>%B</literal></entry>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 5c951013ca04161992efed8b86fb40f55669958e Maintainer: fabioluciano Status: ready --><!-- CREDITS: felipe, surfmax, thiago, fabioluciano, adiel, leonardolara -->
<!-- splitted from ./en/functions/datetime.xml, last change in rev 1.8 -->
<refentry xml:id="function.strtotime" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<refnamediv>
<refname>strtotime</refname>
@@ -10,7 +10,7 @@
&reftitle.description;
<methodsynopsis>
<type class="union"><type>int</type><type>false</type></type><methodname>strtotime</methodname>
<methodparam><type>string</type><parameter>time</parameter></methodparam>
<methodparam><type>string</type><parameter>datetime</parameter></methodparam>
<methodparam choice="opt"><type class="union"><type>int</type><type>null</type></type><parameter>baseTimestamp</parameter><initializer>&null;</initializer></methodparam>
</methodsynopsis>
<simpara>
@@ -44,7 +44,7 @@
<para>
<variablelist>
<varlistentry>
<term><parameter>time</parameter></term>
<term><parameter>datetime</parameter></term>
<listitem>
<para>&date.formats.parameter;</para>
</listitem>
@@ -191,7 +191,6 @@ if (($timestamp = strtotime($str)) === false) {
<member><classname>DateTimeImmutable</classname></member>
<member><methodname>DateTimeImmutable::createFromFormat</methodname></member>
<member><link linkend="datetime.formats">Formatos de Data e Hora</link></member>
<member><methodname>DateTime::createFromFormat</methodname></member>
<member><function>checkdate</function></member>
<member><function>strptime</function></member>
</simplelist>

View File

@@ -14,7 +14,7 @@
</methodsynopsis>
<para>
Retorna o horário atual medido como o número de segundos desde
a Época Unix (January 1 1970 00:00:00 GMT).
a Época Unix (1 de janeiro de 1970 00:00:00 GMT).
</para>
<note>
<para>
@@ -43,7 +43,7 @@
&reftitle.examples;
<para>
<example>
<title><function>time</function> example</title>
<title>Exemplo de <function>time</function></title>
<programlisting role="php">
<![CDATA[
<?php

View File

@@ -123,7 +123,8 @@
<para>
O fuso horário padrão usado por todas as funções de data/hora.
A ordem de precedência para qual fuso horário será utilizado se nenhum
for explicitamente mencionado é descrita na função <function>date_default_timezone_get</function>. Acesse <xref
for explicitamente mencionado é descrita na
função <function>date_default_timezone_get</function>. Acesse <xref
linkend="timezones"/> para uma lista de todos os fusos horários suportados.
</para>
</listitem>

34
security/sessions.xml Normal file
View File

@@ -0,0 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 8782bc734072865ade29b8951bc94d98a53750ef Maintainer: leonardolara Status: ready --><!-- CREDITS: leonardolara -->
<chapter xml:id="security.sessions" xmlns="http://docbook.org/ns/docbook">
<title>Segurança da Sessão</title>
<para>
É importante manter o gerenciamento de sessão HTTP seguro. A segurança
relacionada a sessão está descrita na seção
<link linkend="session.security">Segurança de Sessão</link>
da referência <link linkend="book.session">Módulo de Sessão</link>.
</para>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->