Mostrar mensagens com a etiqueta Programação em PHP. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta Programação em PHP. Mostrar todas as mensagens

31/01/19

Imagem: PHP - pgort140.DLL não foi encontrado
Depois de instalar uma versão de desenvolvimento do php (versão master), encontrei uma dificuldade que não consigo resolver. Parece ser um erro na compilação do php (master), porque as versões mais antigas funcionam...

A imagem no inicio deste post é um screenshot da mensagem de erro que diz:
php.exe - Erro de sistema
A execução de código não pode avançar porque pgort140.dll não foi encontrado. Reinstalar o programa poderá corrigir o problema.

Sistema Operativo que estou a usar é o Windows 10 (32-bits).

Já tive esse problema no passado e disseram-me que era uma problema na compilação do php, mas agora o problema repete-se e desde ontem que não consigo usar o php (master).
Já enviei um post para a página de bugs do php: https://bugs.php.net/bug.php?id=77551


Atualização: Já funciona! A equipa de desenvolvedores do PHP já corrigiu o problema!
Nota: Caso alguém tenha o mesmo problema, deve instalar uma versão anterior, de preferência estável.
Caso queira testar as versões em desenvolvimento, terá de ir acompanhando o lançamento de novos snapshots.

Caso tenham alguma dúvida/sugestão deixem um comentário no fundo desta página...

28/01/19

PHP 8 - JIT
Finalmente! A tão esperada versão 8 do PHP já começou a ser desenvolvida!
Espera-se que haja uma grande melhoria em termos de desempenho para scripts pesados, mas ainda é muito cedo para discutir essas diferenças. O que importa é que já se deu hoje inicio ao seu desenvolvimento, por isso, preparem-se para as novidades!

Fala-se muito do novo compilador JIT para o PHP...
Em uma abordagem "muito suave",
um compilador just-in-time (JIT) pegará a saída dos opcodes e, em vez de interpretá-los, os compilará em código de máquina e invocará esse código de objeto. Um JIT deve superar a ineficiência de interpretar opcodes toda vez que um programa é executado.

Quem estiver interessado neste assunto, pode acompanhar o website: externals.io

Deixem comentários nesta página, se estiverem interessados em discutir o assunto.

26/07/18

A versão mais recente do PHP, que ainda está em testes, PHP 7.3 alpha 4 que em breve irá passar para beta, já pode ser descarregada e muitos programadores já estão a usar e a testar.

Ver: PHP 7.3 (Alpha4) já está disponível para download.

Como é óbvio, todos os programadores usam bases de dados e o PhpMyAdmin é um dos melhores sistemas para gerir as bases de dados, sejam com servidor MySql ou MariaDB.

O que acontece é que quem está a usar a versão 7.3 do PHP e o PhpMyAdmin mais recente que neste momento se encontra na versão 4.8.2, poderá estar a visualizar uma mensagem de aviso.

Aviso do phpmyadmin: continue targeting switch is equivalent to break. Did you mean to use continue 2?

A mensagem de aviso diz:

Warning in .\libraries\classes\Config\FormDisplay.php#658
"continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"?

Backtrace

.\vendor\composer\ClassLoader.php#444: include()
.\vendor\composer\ClassLoader.php#322: Composer\Autoload\includeFile(string 'C:\xampp\phpMyAdmin\vendor\composer/../../libraries/classes\Config\FormDisplay.php')
Composer\Autoload\ClassLoader->loadClass(string 'PhpMyAdmin\Config\FormDisplay')
.\libraries\classes\Config\Forms\BaseForm.php#16: spl_autoload_call(string 'PhpMyAdmin\Config\FormDisplay')
.\vendor\composer\ClassLoader.php#444: include(.\libraries\classes\Config\Forms\BaseForm.php)
.\vendor\composer\ClassLoader.php#322: Composer\Autoload\includeFile(string 'C:\xampp\phpMyAdmin\vendor\composer/../../libraries/classes\Config\Forms\BaseForm.php')
Composer\Autoload\ClassLoader->loadClass(string 'PhpMyAdmin\Config\Forms\BaseForm')
.\libraries\classes\Config\Forms\User\FeaturesForm.php#12: spl_autoload_call(string 'PhpMyAdmin\Config\Forms\BaseForm')
.\vendor\composer\ClassLoader.php#444: include(.\libraries\classes\Config\Forms\User\FeaturesForm.php)
.\vendor\composer\ClassLoader.php#322: Composer\Autoload\includeFile(string 'C:\xampp\phpMyAdmin\vendor\composer/../../libraries/classes\Config\Forms\User\FeaturesForm.php')
Composer\Autoload\ClassLoader->loadClass(string 'PhpMyAdmin\Config\Forms\User\FeaturesForm')
.\libraries\classes\Config\Forms\BaseFormList.php#123: spl_autoload_call(string 'PhpMyAdmin\Config\Forms\User\FeaturesForm')
.\libraries\classes\UserPreferences.php#181: PhpMyAdmin\Config\Forms\BaseFormList::getFields()
.\libraries\classes\Config.php#885: PhpMyAdmin\UserPreferences->apply(array)
.\libraries\common.inc.php#453: PhpMyAdmin\Config->loadUserPreferences()
.\db_structure.php#14: require_once(.\libraries\common.inc.php)


Eu já tinha feito um post acerca disto, ver: PhpMyAdmin incompativel com PHP 7.3 ?

O problema é relativo ao comando "continue" que se encontra dentro de um "switch" e começa a confusão.

Depois de enviar uma mensagem ao sistema de bugs do php, aconselharam-me a contactar os programadores do PhpMyAdmin, pois ao que parece o problema não é do PHP, que embora esteja em testes, mas sim do phpmyadmin que tem de atualizar o código para suportar a nova versão do php.

Assim sendo, fui ao GitHub do PhpMyAdmin (https://github.com/phpmyadmin/phpmyadmin), e deixei uma mensagem para os programadores que desenvolvem este sistema.

A situação já era conhecida. Na secção "Pull Requests" (puxar pedidos), já tem lá um tópico com o problema, ou seja, na próxima versão do PhpMyAdmin que deve ser a 4.8.3, a situação já deve estar resolvida.

Como resolver/corrigir manualmente na versão atual 4.8.2 ?

Para resolver o problema é muito simples, basta ir ao ficheiro "libraries/classes/Config/FormDisplay.php" que se encontra no diretorio do phpmyadmin e alterar a linha 658 onde diz "continue" e alterar para "continue 2".

Pronto, o problema está resolvido e já pode usar o PhpMyAdmin com o PHP-7.3 à vontade e sem problemas.

Encontrou mais problemas? Não desespere, deixe um comentário no fundo desta página, nos comentários.

Gostou deste artigo de ajuda? Partilhe com os seus amigos programadores!

13/07/18

Esta semana decidi atualizar a minha versão do PHP 7.2 para a mais recente, o PHP 7.3.

Em alguns testes que fiz de benchmark, achei por bem instalar a versão em desenvolvimento mais recente do PHP, o PHP 7.3-dev.

Até aí, tudo bem. O problema foi quando abri o PhpMyAdmin...

Surgiu um erro estranho:

Warning in .\libraries\classes\Config\FormDisplay.php#689 "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"?

Warning in .\libraries\classes\Config\FormDisplay.php#689
"continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"?
Backtrace
.\vendor\composer\ClassLoader.php#444: include()
.\vendor\composer\ClassLoader.php#322: Composer\Autoload\includeFile(string 'C:\\xampp\\phpMyAdmin\\vendor\\composer/../../libraries/classes\\Config\\FormDisplay.php')
Composer\Autoload\ClassLoader->loadClass(string 'PhpMyAdmin\\Config\\FormDisplay')
.\libraries\classes\Config\Forms\BaseForm.php#16: spl_autoload_call(string 'PhpMyAdmin\\Config\\FormDisplay')
.\vendor\composer\ClassLoader.php#444: include(.\libraries\classes\Config\Forms\BaseForm.php)
.\vendor\composer\ClassLoader.php#322: Composer\Autoload\includeFile(string 'C:\\xampp\\phpMyAdmin\\vendor\\composer/../../libraries/classes\\Config\\Forms\\BaseForm.php')
Composer\Autoload\ClassLoader->loadClass(string 'PhpMyAdmin\\Config\\Forms\\BaseForm')
.\libraries\classes\Config\Forms\User\FeaturesForm.php#12: spl_autoload_call(string 'PhpMyAdmin\\Config\\Forms\\BaseForm')
.\vendor\composer\ClassLoader.php#444: include(.\libraries\classes\Config\Forms\User\FeaturesForm.php)
.\vendor\composer\ClassLoader.php#322: Composer\Autoload\includeFile(string 'C:\\xampp\\phpMyAdmin\\vendor\\composer/../../libraries/classes\\Config\\Forms\\User\\FeaturesForm.php')
Composer\Autoload\ClassLoader->loadClass(string 'PhpMyAdmin\\Config\\Forms\\User\\FeaturesForm')
.\libraries\classes\Config\Forms\BaseFormList.php#123: spl_autoload_call(string 'PhpMyAdmin\\Config\\Forms\\User\\FeaturesForm')
.\libraries\classes\UserPreferences.php#48: PhpMyAdmin\Config\Forms\BaseFormList::getFields()
.\libraries\classes\Config\PageSettings.php#80: PhpMyAdmin\UserPreferences->pageInit()
.\libraries\classes\Config\PageSettings.php#210: PhpMyAdmin\Config\PageSettings->__construct(string 'Browse')
.\sql.php#23: PhpMyAdmin\Config\PageSettings::showGroup(string 'Browse')

A versão que uso do PhpMyAdmin é mais recente no momento, versão 4.8.2. com Versão do servidor: 10.1.34-MariaDB.

É logico que para resolver o problema, basta instalar a versão anterior do php, mas a curiosidade também tem o seu valor.

Pelo que vi no site de bugs do php, não há lá nada relacionado com isto.

A questão é:

Será que o Php 7.3 tem algum bug, ou o PhpMyAdmin ainda não é compativel com o PHP 7.3?

06/07/18

A equipe do PHP tem o prazer de anunciar o lançamento da terceira versão do PHP 7.3.0, PHP 7.3.0 Alpha 3. O esboço do ciclo de lançamento do PHP 7.3 está especificado no PHP Wiki .
Para downloads de fontes do PHP 7.3.0 Alpha 3, visite a página de download . Fontes e binários do Windows podem ser encontrados em windows.php.net/qa/ .
Por favor, teste cuidadosamente esta versão e relate todos os problemas encontrados no sistema de relatórios de erros .
ESTA É UMA VISUALIZAÇÃO DE DESENVOLVIMENTO - NÃO USE-O NA PRODUÇÃO!
Para obter mais informações sobre os novos recursos e outras alterações, você pode ler o arquivo NEWS ou o arquivo UPGRADING para obter uma lista completa de notas de atualização. Esses arquivos também podem ser encontrados no arquivo de lançamento.
O próximo lançamento seria o Beta 1, planejado para 19 de julho.
As assinaturas para o lançamento podem ser encontradas no manifesto ou no site do QA .
Obrigado por nos ajudar a melhorar o PHP.

Changelog PHP 7.3 - Alpha 3:


05 Jul 2018, PHP 7.3.0alpha3

- Core:
. Fixed bug #76534 (PHP hangs on 'illegal string offset on string references
with an error handler). (Laruence)
. Fixed bug #76520 (Object creation leaks memory when executed over HTTP).
(Nikita)
. Fixed bug #76502 (Chain of mixed exceptions and errors does not serialize
properly). (Nikita)
. Fixed bug #76509 (Inherited static properties can be desynchronized from
their parent by ref). (Nikita)
. Fixed bug #76439 (Changed behaviour in unclosed HereDoc). (Nikita, tpunt)
. Added syslog.facility and syslog.ident INI entries for customizing syslog
logging. (Philip Prindeville)
. Fixed bug #63217 (Constant numeric strings become integers when used as
ArrayAccess offset). (Rudi Theunissen)

- DOM:
. Fixed bug #76285 (DOMDocument::formatOutput attribute sometimes ignored).
(Andrew Nester)

- FPM:
. Fixed bug #73342 (Vulnerability in php-fpm by changing stdin to
non-blocking). (Nikita)

- GMP:
. Fixed bug #74670 (Integer Underflow when unserializing GMP and possible
other classes). (Nikita)

- intl:
. Fixed bug #76556 (get_debug_info handler for BreakIterator shows wrong
type). (cmb)

- mbstring:
. Fixed bug #76532 (Integer overflow and excessive memory usage
in mb_strimwidth). (MarcusSchwarz)

- OpenSSL:
. Add min_proto_version and max_proto_version ssl stream options as well as
related constants for possible TLS protocol values. (Jakub Zelenka)

- PCRE:
. Fixed bug #76512 (\w no longer includes unicode characters). (cmb)
. Fixed bug #76514 (Regression in preg_match makes it fail with
PREG_JIT_STACKLIMIT_ERROR). (Anatol)

- PGSQL:
. Fixed bug #76548 (pg_fetch_result did not fetch the next row). (Anatol)

- phpdbg:
. Fix arginfo wrt. optional/required parameters. (cmb)

- Reflection:
. Fixed bug #76536 (PHP crashes with core dump when throwing exception in
error handler). (Laruence)
. Fixed bug #75231 (ReflectionProperty#getValue() incorrectly works with
inherited classes). (Nikita)

- Standard:
. Fixed bug #76505 (array_merge_recursive() is duplicating sub-array keys).
(Laruence)
. Fixed bug #71848 (getimagesize with $imageinfo returns false). (cmb)

- Tokenizer:
. Fixed bug #76538 (token_get_all with TOKEN_PARSE flag fails to recognise
close tag with newline). (Nikita)

29/06/18

Download: PHP 7.3.0 alpha 2
A equipe PHP já anunciou o lançamento da segunda versão do PHP 7.3.0, PHP 7.3.0 Alpha 2. O esboço do ciclo de lançamento do PHP 7.3 é especificado no PHP Wiki.

Para downloads de fontes do PHP 7.3.0 Alpha 2, visite a página de download. Fontes e binários do Windows podem ser encontrados em windows.php.net/qa/.

Por favor, teste cuidadosamente esta versão e relate todos os problemas encontrados no sistema de relatórios de erros.

ESTA É UMA VISUALIZAÇÃO DE DESENVOLVIMENTO - NÃO USE-O NA PRODUÇÃO!

Para obter mais informações sobre os novos recursos e outras alterações, você pode ler o arquivo NEWS ou o arquivo UPGRADING para obter uma lista completa de notas de atualização. Esses arquivos também podem ser encontrados no arquivo de lançamento.

O próximo lançamento seria Alpha 3, planejado para 5 de julho.

As assinaturas para o lançamento podem ser encontradas no manifesto ou no site do QA.

Changelog:

21 Jun 2018, PHP 7.3.0alpha2

- Core:
. Fixed bug #76427 (Segfault in zend_objects_store_put). (Laruence)
. Fixed bug #76422 (ftruncate fails on files > 2GB). (Anatol)

- CLI:
. Fixed bug #44217 (Output after stdout/stderr closed cause immediate exit
with status 0). (Robert Lu)

- Date:
. Fixed bug #76462 (Undefined property: DateInterval::$f). (Anatol)

- EXIF:
. Fixed bug #76409 (heap use after free in _php_stream_free). (cmb)

- Interbase:
. Fixed bug #76443 (php+php_interbase.dll crash on module_shutdown). (Kalle)

- Mysqlnd:
. Fixed bug #76386 (Prepared Statement formatter truncates fractional seconds
from date/time column). (Victor Csiky)

- Opcache:
. Fixed bug #76477 (Opcache causes empty return value).
(Nikita, Laruence)
. Fixed bug #76466 (Loop variable confusion). (Dmitry, Laruence, Nikita)
. Fixed bug #76463 (var has array key type but not value type). (Laruence)
. Fixed bug #76446 (zend_variables.c:73: zend_string_destroy: Assertion
`!(zval_gc_flags((str)->gc)). (Nikita, Laruence)

- Tokenizer:
. Fixed bug #76437 (token_get_all with TOKEN_PARSE flag fails to recognise
close tag). (Laruence)
. Fixed bug #75218 (Change remaining uncatchable fatal errors for parsing
into ParseError). (Nikita)

- ZIP:
. Fixed bug #76461 (OPSYS_Z_CPM defined instead of OPSYS_CPM).
(Dennis Birkholz, Remi)


12/06/18

php
Novidade! O PHP 7.3 já está a ser desenvolvido e já é possível fazer o download do PHP 7.3 Alpha1.

Esta versão ainda está na versão "alpha" pelo que quer dizer, que ainda é muito cedo para usar esta versão do PHP, pois pode estar instável e com muitos bugs.

No entanto, os mais curiosos que tanto anseiam pelas novas funções do php podem agora ter uma ideia de como vai ser esta nova versão.

Na página "Snapshots" do site do PHP já é possível ter acesso às versões mais recentes de desenvolvimento do PHP. Note-se que estas versões não são as versões finais e sim as versões em desenvolvimento.

Para a versão mais recente do php, pode ver este link: PHP para Windows (Snapshots).
Existem vários "snapshots". O PHP 7.3 encontra-se na secção "PHP Master".

Se quiser ter acesso ás versões finais e estáveis, basta entrar na página inicial do php: PHP Homepage.

Veja aqui o changlog do PHP 7.3 (Alpha 1):

07 Jun 2018, PHP 7.3.0alpha1

- Core:
  . Improved PHP GC. (Dmitry, Nikita)
  . Redesigned the old ext_skel program written in PHP, run:
    'php ext_skel.php' for all options. This means there are no dependencies,
    thus making it work on Windows out of the box. (Kalle)
  . Removed support for BeOS. (Kalle)
  . Add PHP_VERSION to phpinfo() . (github/MattJeevas)</p><p>  . Add net_get_interfaces(). (Sara, Joe, Anatol)</p><p>  . Implemented flexible heredoc and nowdoc syntax, per</p><p>    RFC https://wiki.php.net/rfc/flexible_heredoc_nowdoc_syntaxes.</p><p>    (Thomas Punt)</p><p>  . Added support for references in list() and array destructuring, per</p><p>    RFC https://wiki.php.net/rfc/list_reference_assignment.</p><p>    (David Walker)</p><p>  . Fixed bug #75683 (Memory leak in zend_register_functions() in ZTS mode).</p><p>    (Dmitry)</p><p>  . Fixed bug #75031 (support append mode in temp/memory streams). (adsr)</p><p>  . Fixed bug #74860 (Uncaught exceptions not being formatted properly when</p><p>    error_log set to "syslog"). (Philip Prindeville)</p><p>  . Fixed bug #75220 (Segfault when calling is_callable on parent). </p><p>    (andrewnester)</p><p>  . Fixed bug #69954 (broken links and unused config items in distributed ini</p><p>    files). (petk)</p><p>  . Fixed bug #74922 (Composed class has fatal error with duplicate, equal const</p><p>    properties). (pmmaga)</p><p>  . Fixed bug #63911 (identical trait methods raise errors during composition). </p><p>    (pmmaga)</p><p>  . Fixed bug #75677 (Clang ignores fastcall calling convention on variadic</p><p>    function). (Li-Wen Hsu)</p><p>  . Fixed bug #54043 (Remove inconsitency of internal exceptions and user</p><p>    defined exceptions). (Nikita)</p><p>  . Fixed bug #53033 (Mathematical operations convert objects to integers).</p><p>    (Nikita)</p><p>  . Fixed bug #73108 (Internal class cast handler uses integer instead of</p><p>    float). (Nikita)</p><p>  . Fixed bug #75765 (Fatal error instead of Error exception when base class is</p><p>    not found). (Timur Ibragimov)</p><p>  . Fixed bug #76198 (Wording: "iterable" is not a scalar type). (Levi Morrison)</p><p>  . Fixed bug #76137 (config.guess/config.sub do not recognize RISC-V). (cmb)</p><p><br /> </p><p>- BCMath:</p><p>  . Fixed bug #66364 (BCMath bcmul ignores scale parameter). (cmb)</p><p>  . Implemented request #67855 (No way to get current scale in use). (Chris</p><p>    Wright, cmb)</p><p>  . Fixed bug #75164 (split_bc_num() is pointless). (cmb)</p><p>  . Fixed bug #75169 (BCMath errors/warnings bypass PHP's error handling). (cmb)</p><p><br /> </p><p>- cURL:</p><p>  . Fixed bug #74125 (Fixed finding CURL on systems with multiarch support).</p><p>    (cebe)</p><p><br /> </p><p>- Date:</p><p>  . Implemented FR #74668: Add DateTime::createFromImmutable() method.</p><p>    (majkl578, Rican7)</p><p>  . Fixed bug #75222 (DateInterval microseconds property always 0). (jhdxr)</p><p>  . Fixed bug #68406 (calling var_dump on a DateTimeZone object modifies it).</p><p>    (jhdxr)</p><p>  . Fixed bug #76131 (mismatch arginfo for date_create). (carusogabriel)</p><p><br /> </p><p>- DBA:</p><p>  . Fixed bug #75264 (compiler warnings emitted). (petk)</p><p><br /> </p><p>- GD:</p><p>  . Added support for WebP in imagecreatefromstring() (Andreas Treichel, cmb).</p><p><br /> </p><p>- GMP:</p><p>  . Export internal structures and accessor helpers for GMP object. (Sara)</p><p>  . Added gmp_binomial(n, k). (Nikita)</p><p>  . Added gmp_lcm(a, b). (Nikita)</p><p>  . Added gmp_perfect_power(a). (Nikita)</p><p>  . Added gmp_kronecker(a, b). (Nikita)</p><p><br /> </p><p>- interbase:</p><p>  . Fixed bug #75453 (Incorrect reflection for ibase_[p]connect). (villfa)</p><p><br /> </p><p>- intl:</p><p>  . Fixed bug #75317 (UConverter::setDestinationEncoding changes source instead </p><p>    of destination). (andrewnester)</p><p><br /> </p><p>- JSON:</p><p>  . Added JSON_THROW_ON_ERROR flag. (Andrea)</p><p><br /> </p><p>- LDAP:</p><p>  . Added ldap_exop_refresh helper for EXOP REFRESH operation with dds overlay. </p><p>    (Come)</p><p>  . Added full support for sending and parsing ldap controls (Come)</p><p>  . Fixed bug #49876 (Fix LDAP path lookup on 64-bit distros). (dzuelke)</p><p><br /> </p><p>- libxml2:</p><p>  . Fixed bug #75871 (use pkg-config where available). (pmmaga)</p><p><br /> </p><p>- litespeed:</p><p>  . Fixed bug #75248 (Binary directory doesn't get created when building </p><p>    only litespeed SAPI). (petk)</p><p>  . Fixed bug #75251 (Missing program prefix and suffix). (petk)</p><p><br /> </p><p>- mbstring:</p><p>  . Fixed bug #65544 (mb title case conversion-first word in quotation isn't</p><p>    capitalized). (Nikita)</p><p>  . Fixed bug #71298 (MB_CASE_TITLE misbehaves with curled apostrophe/quote.</p><p>    (Nikita)</p><p>  . Fixed bug #73528 (Crash in zif_mb_send_mail). (Nikita)</p><p>  . Fixed bug #74929 (mbstring functions version 7.1.1 are slow compared to 5.3</p><p>    on Windows). (Nikita)</p><p>  . Fixed bug #76319 (mb_strtolower with invalid UTF-8 causes segmentation</p><p>    fault). (Nikita)</p><p>  . Updated to Oniguruma 6.8.2. (cmb)</p><p><br /> </p><p>- ODBC:</p><p>  . Removed support for ODBCRouter. (Kalle)</p><p>  . Removed support for Birdstep. (Kalle)</p><p><br /> </p><p>- OpenSSL:</p><p>  . Added openssl_pkey_derive function. (Jim Zubov)</p><p><br /> </p><p>- PCRE:</p><p>  . Implemented https://wiki.php.net/rfc/pcre2-migration (Anatol, Dmitry)</p><p>  . Fixed bug #75355 (preg_quote() does not quote # control character).</p><p>    (Michael Moravec)</p><p><br /> </p><p>- PDO_DBlib:</p><p>  . Implemented request #69592 (allow 0-column rowsets to be skipped</p><p>    automatically). (fandrieu)</p><p>  . Fixed bug #74243 (allow locales.conf to drive datetime format). (fandrieu)</p><p>  . Expose TDS version as \PDO::DBLIB_ATTR_TDS_VERSION attribute on \PDO</p><p>    instance. (fandrieu)</p><p>  . Treat DATETIME2 columns like DATETIME. (fandrieu)</p><p><br /> </p><p>- PDO_OCI:</p><p>  . Fixed bug #74631 (PDO_PCO with PHP-FPM: OCI environment initialized</p><p>    before PHP-FPM sets it up). (Ingmar Runge)</p><p><br /> </p><p>- PDO SQLite</p><p>  . Add support for additional open flags</p><p><br /> </p><p>- pgsql:</p><p>  . Added new error constants for pg_result_error(): (Kalle)</p><p>    - Requires Postgres 9.3</p><p>      - PGSQL_DIAG_SCHEMA_NAME</p><p><span style="white-space:pre"> </span>  - PGSQL_DIAG_TABLE_NAME</p><p><span style="white-space:pre"> </span>  - PGSQL_DIAG_COLUMN_NAME</p><p><span style="white-space:pre"> </span>  - PGSQL_DIAG_DATATYPE_NAME</p><p><span style="white-space:pre"> </span>  - PGSQL_DIAG_CONSTRAINT_NAME</p><p><span style="white-space:pre"> </span>- Requires Postgres 9.6</p><p><span style="white-space:pre"> </span>  - PGSQL_DIAG_SEVERITY_NONLOCALIZED</p><p><br /> </p><p>- phar:</p><p>  . Fixed bug #74991 (include_path has a 4096 char limit in some cases).</p><p>    (bwbroersma)</p><p>  . Fixed bug #65414 (deal with leading slash when adding files correctly).</p><p>    (bishopb)</p><p><br /> </p><p>- readline:</p><p>  . Added completion_append_character and completion_suppress_append options</p><p>    to readline_info() if linked against libreadline. (krageon)</p><p><br /> </p><p>- Session:</p><p>  . Fixed bug #74941 (session fails to start after having headers sent). </p><p>    (morozov)</p><p><br /> </p><p>- SimpleXML:</p><p>  . Fixed bug #54973 (SimpleXML casts integers wrong). (Nikita)</p><p><br /> </p><p>- SOAP:</p><p>  . Fixed bug #75464 (Wrong reflection on SoapClient::__setSoapHeaders). (villfa)</p><p>  . Fixed bug #70469 (SoapClient generates E_ERROR even if exceptions=1 is</p><p>    used). (Anton Artamonov)</p><p><br /> </p><p>- SPL:</p><p>  . Fixed bug #74977 (Appending AppendIterator leads to segfault). </p><p>    (Andrew Nester)</p><p>  . Fixed bug #75173 (incorrect behavior of AppendIterator::append in foreach</p><p>    loop). (jhdxr)</p><p>  . Fixed bug #74372 (autoloading file with syntax error uses next autoloader,</p><p>    may hide parse error). (Nikita)</p><p>  . Fixed bug #75878 (RecursiveTreeIterator::setPostfix has wrong signature).</p><p>    (cmb)</p><p>  . Fixed bug #74519 (strange behavior of AppendIterator). (jhdxr)</p><p>  . Fixed bug #76131 (mismatch arginfo for splarray constructor). </p><p>    (carusogabriel)</p><p><br /> </p><p>- SQLite3:</p><p>  . Updated bundled libsqlite to 3.24.0. (cmb)</p><p><br /> </p><p>- Standard:</p><p>  . Added is_countable() function. (Gabriel Caruso)</p><p>  . Fixed bug #75916 (DNS_CAA record results contain garbage). (Mike, </p><p>    Philip Sharp)</p><p>  . Fixed unserialize(), to disable creation of unsupported data structures</p><p>    through manually crafted strings. (Dmitry)</p><p>  . Fixed bug #75409 (accept EFAULT in addition to ENOSYS as indicator </p><p>    that getrandom() is missing). (sarciszewski)</p><p>  . Fixed bug #74719 (fopen() should accept NULL as context). (Alexander Holman)</p><p>  . Fixed bug #69948 (path/domain are not sanitized in setcookie). (cmb)</p><p>  . Fixed bug #75996 (incorrect url in header for mt_rand). (tatarbj)</p><p>  . Remove superfluous warnings from inet_ntop()/inet_pton(). (daverandom)</p><p><br /> </p><p>- Testing:</p><p>  . Implemented request #62055 (Make run-tests.php support --CGI-- sections).</p><p>    (cmb)</p><p><br /> </p><p>- Tidy:</p><p>  . Fixed bug #74707 (Tidy has incorrect ReflectionFunction param counts for</p><p>    functions taking tidy). (Gabriel Caruso)</p><p><br /> </p><p>- Zlib:</p><p>  . Added zlib/level context option for compress.zlib wrapper. (Sara)</p>

07/06/18

imagem do logotipo do php
Antes de mais, para quem não sabe o que significa, benchmark é o termo que se usa para a verificação de velocidade, que neste caso é do php e para quem usa um pacote tudo-em-um, como por exemplo o XAMPP, também se verifica a ligação às bases de dados do MySQL que usa o "motor" MariaDB 10.1.32.

Quem trabalha com programação, normalmente tem sempre em conta a performance das suas aplicações para que os seus utilizadores não sofram com a lentidão de uma tarefa simples.

É claro que aplicações "leves" não precisam de uma análise profunda de benchmark, no entanto, as aplicações mais pesadas devem sempre ser alvo de análises de desempenho para que aqueles segundos aqui e ali todos somados não se tornem em minutos!

Neste post não vou dar nenhuma aula de programação, vou apenas disponibilizar uma ferramenta para que vocês possam analisar a velocidade do vosso servidor e possam assim poder alterar a configuração de forma a obterem os melhores resultados.

Na imagem abaixo, mostro uma imagem de um benchmark ao meu laptop (fraquinho), que tem o xampp instalado com o PHP 7.2.5.

Imagem Benchmark PHP 7.2.5 e MySql

É claro que estamos a falar de um laptop fraquinho, no entanto, com esses valores, podemos em seguida fazer uma alteração nos ficheiros de configuração e em seguida correr novamente o benchmark para ver se conseguimos melhorar os resultados.

É claro que vou disponibilizar o código para esse benchmark!

O código que tenho, encontrei na internet e na minha opinião está muito bom.



/**
 * PHP Script to benchmark PHP and MySQL-Server
 *
 * inspired by / thanks to:
 * - www.php-benchmark-script.com  (Alessandro Torrisi)
 * - www.webdesign-informatik.de
 *
 * @author odan
 * @license MIT
 */

// -----------------------------------------------------------------------------
// Setup
// -----------------------------------------------------------------------------
set_time_limit(120); // 2 minutes

$options = array();

// Show or hide the server name and IP address
$showServerName = false;

// Optional: mysql performance test
$options['db.host'] = 'localhost';
$options['db.user'] = 'root';
$options['db.pw'] = '';
$options['db.name'] = 'test';

// -----------------------------------------------------------------------------
// Main
// -----------------------------------------------------------------------------
// check performance
$benchmarkResult = test_benchmark($options);

// html output
echo "\n\n";
echo "
   
    ";

echo print_benchmark_result($benchmarkResult, $showServerName);

echo "\n
";exit;

// -----------------------------------------------------------------------------
// Benchmark functions
// -----------------------------------------------------------------------------

function test_benchmark($settings)
{
    $result = array();
    $result['version'] = '1.2';
    $result['sysinfo']['time'] = date('Y-m-d H:i:s');
    $result['sysinfo']['php_version'] = PHP_VERSION;
    $result['sysinfo']['platform'] = PHP_OS;
    $result['sysinfo']['server_name'] = $_SERVER['SERVER_NAME'];
    $result['sysinfo']['server_addr'] = $_SERVER['SERVER_ADDR'];
    $result['sysinfo']['xdebug'] = in_array('xdebug', get_loaded_extensions());

    $timeStart = microtime(true);

    test_math($result);
    test_string($result);
    test_loops($result);
    test_ifelse($result);

    $result['benchmark']['calculation_total'] = timer_diff($timeStart) . ' sec.';

    if (isset($settings['db.host'])) {
        test_mysql($result, $settings);
    }

    $result['benchmark']['total'] = timer_diff($timeStart) . ' sec.';

    return $result;
}

function test_math(&$result, $count = 99999)
{
    $timeStart = microtime(true);

    $mathFunctions = array("abs", "acos", "asin", "atan", "bindec", "floor", "exp", "sin", "tan", "pi", "is_finite", "is_nan", "sqrt");
    for ($i = 0; $i < $count; $i++) {
        foreach ($mathFunctions as $function) {
            call_user_func_array($function, array($i));
        }
    }
    $result['benchmark']['math'] = timer_diff($timeStart) . ' sec.';
}

function test_string(&$result, $count = 99999)
{
    $timeStart = microtime(true);
    $stringFunctions = array("addslashes", "chunk_split", "metaphone", "strip_tags", "md5", "sha1", "strtoupper", "strtolower", "strrev", "strlen", "soundex", "ord");

    $string = 'the quick brown fox jumps over the lazy dog';
    for ($i = 0; $i < $count; $i++) {
        foreach ($stringFunctions as $function) {
            call_user_func_array($function, array($string));
        }
    }
    $result['benchmark']['string'] = timer_diff($timeStart) . ' sec.';
}

function test_loops(&$result, $count = 999999)
{
    $timeStart = microtime(true);
    for ($i = 0; $i < $count; ++$i) {

    }

    $i = 0;
    while ($i < $count) {
        ++$i;
    }

    $result['benchmark']['loops'] = timer_diff($timeStart) . ' sec.';
}

function test_ifelse(&$result, $count = 999999)
{
    $timeStart = microtime(true);
    for ($i = 0; $i < $count; $i++) {
        if ($i == -1) {

        } elseif ($i == -2) {

        } else {
            if ($i == -3) {

            }
        }
    }
    $result['benchmark']['ifelse'] = timer_diff($timeStart) . ' sec.';
}

function test_mysql(&$result, $settings)
{
    $timeStart = microtime(true);

    $link = mysqli_connect($settings['db.host'], $settings['db.user'], $settings['db.pw']);
    $result['benchmark']['mysql_connect'] = timer_diff($timeStart) . ' sec.';

    mysqli_select_db($link, $settings['db.name']);
    $result['benchmark']['mysql_select_db'] = timer_diff($timeStart) . ' sec.';

    $dbResult = mysqli_query($link, 'SELECT VERSION() as version;');
    $arr_row = mysqli_fetch_array($dbResult);
    $result['sysinfo']['mysql_version'] = $arr_row['version'];
    $result['benchmark']['mysql_query_version'] = timer_diff($timeStart) . ' sec.';

    $query = "SELECT BENCHMARK(1000000,ENCODE('hello',RAND()));";
    mysqli_query($link, $query);
    $result['benchmark']['mysql_query_benchmark'] = timer_diff($timeStart) . ' sec.';

    mysqli_close($link);

    $result['benchmark']['mysql_total'] = timer_diff($timeStart) . ' sec.';

    return $result;
}

function timer_diff($timeStart)
{
    return number_format(microtime(true) - $timeStart, 3);
}

function print_benchmark_result($data, $showServerName = true)
{
    $result = '';

    $result .= '
System Info
';
    $result .= '';
    $result .= '
Version
' . h($data['version']) . '
';
    $result .= '
Time
' . h($data['sysinfo']['time']) . '
';

    if (!empty($data['sysinfo']['xdebug'])) {
        // You are running the benchmark with xdebug enabled. This has a major impact on runtime performance.
        $result .= '
Xdebug
'
            . h('Warning: Xdebug is enabled!')
            . '
';    }

    $result .= '
PHP Version
' . h($data['sysinfo']['php_version']) . '
';
    $result .= '
Platform
' . h($data['sysinfo']['platform']) . '
';

    if ($showServerName == true) {
        $result .= '
Server name
' . h($data['sysinfo']['server_name']) . '
';
        $result .= '
Server address
' . h($data['sysinfo']['server_addr']) . '
';
    }

    $result .= '
';
    $result .= '
Benchmark
';
    $result .= '';
    $result .= '
String
' . h($data['benchmark']['string']) . '
';
    $result .= '
Loops
' . h($data['benchmark']['loops']) . '
';
    $result .= '
If Else
' . h($data['benchmark']['ifelse']) . '
';
    $result .= '
Calculation total
' . h($data['benchmark']['calculation_total']) . '
';
    $result .= '
';
    if (isset($data['sysinfo']['mysql_version'])) {
        $result .= '
MySQL
';
        $result .= '';
        $result .= '
MySQL Version
' . h($data['sysinfo']['mysql_version']) . '
';
        $result .= '
MySQL Connect
' . h($data['benchmark']['mysql_connect']) . '
';
        $result .= '
MySQL Select DB
' . h($data['benchmark']['mysql_select_db']) . '
';
        $result .= '
MySQL Query Version
' . h($data['benchmark']['mysql_query_version']) . '
';
        $result .= '
MySQL Benchmark
' . h($data['benchmark']['mysql_query_benchmark']) . '
';
        $result .= '
MySQL Total
' . h($data['benchmark']['mysql_total']) . '
';
        $result .= '
';    }

    $result .= '
Total
' . h($data['benchmark']['total']) . '
';
    $result .= '
';
    return $result;
}

function h($v)
{
    return htmlentities($v);
}


Lembre-se de no início do código alterar a configuração do mysql.

Vantagens deste benchmark:
  • Pode alterar os valores dos ficheiros de configuração de acordo com a capacidade do seu servidor e verificar qual a melhor configuração para o seu servidor.
  • Sempre que atualizar o PHP, pode verificar se essa versão está mais rápida ou mais lenta.

O que achou deste artigo? Acha que devo continuar a desenvolver este assunto?

29/04/18

Imagem PHP 7

A equipa de desenvolvimento do PHP já anunciou a disponibilidade imediata do PHP 7.2.5 com a data de lançamento em 26 de Abril de 2018.

Esta é uma versão de segurança que também contém várias pequenas correções de bugs.

Todos os utilizadores do PHP 7.2 são encorajados a atualizar para esta versão.

A lista de alterações é sempre registada no ChangeLog.

PHP 7.2.5 Changelog (em inglês):

Core:
  • Fixed bug #75722 (Convert valgrind detection to configure option).
Date:
  • Fixed bug #76131 (mismatch arginfo for date_create).
Exif:
  • Fixed bug #76130 (Heap Buffer Overflow (READ: 1786) in exif_iif_add_value).
FPM:
  • Fixed bug #68440 (ERROR: failed to reload: execvp() failed: Argument list too long).
  • Fixed incorrect write to getenv result in FPM reload.
GD:
  • Fixed bug #52070 (imagedashedline() - dashed line sometimes is not visible).
iconv:
  • Fixed bug #76249 (stream filter convert.iconv leads to infinite loop on invalid sequence).
intl:
  • Fixed bug #76153 (Intl compilation fails with icu4c 61.1).
ldap:
  • Fixed bug #76248 (Malicious LDAP-Server Response causes Crash).
mbstring:
  • Fixed bug #75944 (Wrong cp1251 detection).
  • Fixed bug #76113 (mbstring does not build with Oniguruma 6.8.1).
ODBC:
  • Fixed bug #76088 (ODBC functions are not available by default on Windows).
Opcache:
  • Fixed bug #76094 (Access violation when using opcache).
Phar:
  • Fixed bug #76129 (fix for CVE-2018-5712 may not be complete).
phpdbg:
  • Fixed bug #76143 (Memory corruption: arbitrary NUL overwrite).
SPL:
  • Fixed bug #76131 (mismatch arginfo for splarray constructor).
standard:
  • Fixed bug #74139 (mail.add_x_header default inconsistent with docs).
  • Fixed bug #75996 (incorrect url in header for mt_rand).
Se quiser ver as grandes novidades do php 7, pode ver este artigo: PHP 7, veja as grandes novidades!
O download do php 7 pode ser feito na página de downloads do php 7.

21/12/17

XAMPP (Apache, Mysql/MariaDB, PHP)Finalmente chegou o pacote para quem gosta de programar em php, com tudo incluído, ou seja, o PHP, Apache, MariaDB, OpenSSL, phpMyAdmin e muito mais... e tudo atualizado!

A versão mais recente do XAMPP já traz o PHP 7.2.0! Além disso, também traz os pacotes essenciais para programadores completamente atualizados!

As atualizações do xampp são as seguintes:

PHP versão 7.2.0
Apache versão 2.4.29
MariaDB versão 10.1.29
OpenSSL versão 1.0.2n
phpMyAdmin versão 4.7.6

Nota: O XAMPP também tem suporte para programadores de PERL.

O XAMPP pode ser encontrado no site ApacheFriends.org. Apenas tem de escolher o download correspondente ao seu sistema operativo e fazer o respectivo download!

Não vou falar aqui de todas as alterações, mas posso dizer que são várias as melhorias, basta ver por exemplo o changelog do php7.

Se quiser discutir o tema aqui, desde a intslação até à programação em PHP, deixe um comentário!

02/02/17

Logo XAMPP
Finalmente!
Há algum tempo que já estava disponível a nova versão do PHP 7.1 e o grupo que gere o XAMPP, o ApacheFriends ainda só tinha disponível a versão 7.0.13 do PHP.

O PHP já tinha as novas versões 7.0.14 e 7.0.15, além da 7.1 e 7.1.1 e a equipa do XAMPP estava a levar tempo em fazer alguma atualização...mas já está! :)

Hoje, dia 2 de Fevereiro de 2017 finalmente ficou disponível a nova versão do XAMPP com o PHP 7.1.1.

Nesta nova versão do PHP 7, foram introduzidas imensas actualizações e melhorias, basta acompanhar o changelog do PHP.

Mas...o XAMPP também tem muitas novidades! Nesta nova versão (que eu estava super ancioso, porque parecia que nunca mais chegava), as novidades são:
Versão v7.1.1-0

Atualização do PHP para a versão 7.1.1
Atualização do Apache para a versão 2.4.25
Atualização do OpenSSL para a versão 1.0.2j
Atualização do MariaDB para a versão 10.1.21

Nota: Agora o XAMPP usa a MariaDB em vez do MySql, mas continua tudo igual como na versão com o MySQL. (Os comandos de SQL são os mesmos)

Quem estiver interessado em usar o XAMPP (que inclui o Apache + MariaDB + PHP + Perl) só tem de ir a este site: https://www.apachefriends.org

Importante: Lembrem-se sempre de ler a documentação do PHP, pois alguns comandos foram alterados, outros eliminados e outros comandos novos foram introduzidos no PHP 7.

Se tiverem dúvidas ou sugestões é só adicionar comentário! :)

29/01/16

Este post é apenas para quem usa o ubuntu ou semelhante como o kubuntu.

logotipo do php7
O novo php7 já chegou e pelo que se diz pode ser até 9 vezes mais rápido que o php 5.6.

Como gosto de estar atualizado, e principalmente pelo desempenho que se anuncia sobre o php 7, decidi então instalar...mas...pode não ser assim tão fácil quando temos o PhpMyAdmin instalado com o php5.

O que acontece, é que depois de atualizar o php para a versão 7 e depois de atualizar o phpmyadmin para a versão mais recente que neste momento é a 4.5.4, pode acontecer que não se consegue aceder mais ao phpmyadmin.

Depois de ver o log (em var/log/apache2/error.log) encontrei o erro:

[:error] [pid 5855] [client ::1:38433] PHP Fatal error: Uncaught Error: Class 'phpseclib\\Crypt\\Random' not found in /usr/share/phpmyadmin/libraries/session.inc.php:116\nStack trace:\n#0 /usr/share/phpmyadmin/libraries/common.inc.php(357): require()\n#1 /usr/share/phpmyadmin/index.php(12): require_once('/usr/share/phpm...')\n#2 {main}\n thrown in /usr/share/phpmyadmin/libraries/session.inc.php on line 116

Depois de analisar esse erro, descobri que o problema era a falta dos ficheiros da libraria "phpseclib", neste caso o ficheiro random.php.

Para resolver o problema, pode encontrar os ficheiros necessários aqui: https://github.com/phpseclib/phpseclib/tree/master/phpseclib

A estrutura no seu pc, sobre o ficheiro random.php deve ficar assim:
usr/share/phpmyadmin/libraries/phpseclib/Crypt/Random.php

Caso tenham dúvidas, basta colocar um comentário!

26/01/16

Imagem PHP 7

Em dezembro de 2015 foi lançado o PHP 7, a primeira versão maior a ser liberada depois de anos e a sucessora da 5.6. Essa nova versão traz muitas novidades e é um salto incrível para o PHP em termos de performance e sintaxe do código.
Mas o que houve com o PHP 6? Há alguns anos circulou uma versão preliminar do que pretendiam lançar como o PHP 6. A versão nunca foi concluída, mas algumas empresas a utilizaram e inclusive livros foram publicados sobre ela. Para evitar confundir a nova versão do PHP com essepre-release antigo, resolveram batizá-la de "PHP 7".
Vamos às novidades:

Performance, muita performance!

A performance do PHP 7 em relação ao 5 aumentou em torno de 10–25% de acordo com os primeiros testes. Existem vários testes de performance por aí, alguns sugerindo mais velocidade do que usando a HHVM.

Novas palavras reservadas

No PHP 7 teremos novas palavras reservadas, incluindo os nomes dos tipos de dados primitivos (intfloatboolstringtruefalsenull) além de resource,objectscalarmixed e numeric. Essas palavras não poderão ser usadas em namespaces, nomes de classes, traits e interfaces.
Essa mudança foi feita agora para possibilitar a criação de classes representando tipos escalares em uma versão futura (quem sabe no PHP 7.1!). Para ver a mágica que se pode esperar disso, consulte este repositório:https://github.com/nikic/scalar_objects. Já pensou poder chamar $string->length() ao invés de strlen($string)?

Remoção dos Construtores do PHP 4

No PHP 5 ainda era suportado o jeito antigo de escrever métodos construtores para as classes. No PHP 7 esses construtores antigos lançarão um aviso do tipo E_DEPRECATED
class Veiculo
{
    public function veiculo()
    {
        // um construtor no PHP 4, lançará um E_DEPRECATED no PHP 7
    }
public function __construct()
    {
        // um construtor no PHP 5
    }
}

Operador "Espaço-nave": <=>

Esse operador funciona de forma semelhante aos <, <=, ==, > e >=, mas caso a comparação seja idêntica, retornará 0. Se o valor da esquerda for maior, retornará 1, se o valor da direita que for maior, retornará -1.
var_dump(42 <=> 42); // retorna 0
var_dump(42 <=> 5); // retorna 1
var_dump(5 <=> 42); // retorna -1

Declaração do Tipo de Retorno

É possível declarar o tipo de retorno dos métodos, desta forma assegurando o tipo de retorno de maneira mais consistente do que simplesmente escrevendo um PHPDoc. Através disso será possível prevenir que um método que sobrescreve outro quebre o tipo de retorno original, além de impossibilitar que um método retorne null, forçando uma boa prática de programação.
function getCliente() : Cliente
{
    return new Cliente; // válido
    // return null; // inválido
    // return 12345; // inválido
    // return new OutraClasse; // inválido
}

Tipos de Parâmetros Escalares

O PHP 5.6 já permite obrigar que um argumento de um método seja do tipo array ou uma instância de determinada classe. Com o PHP 7 também é possível declarar que um parâmetro precisa ser de um tipo escalar (int, float, string e bool):
function somaInteiros(int $a, int $b)
{
    return $a + $b;
}
somaInteiros(1, 2); // retorna 3
somaInteiros("string", false); // erro

Escape de caracteres Unicode

Agora será possível fazer o escape de qualquer caractere Unicode em strings através da seguinte sintaxe:
echo "\u{1F602}"; // imprime o emoji "😂"

Operador "Null Coalesce": ??

Muitas vezes temos a necessidade de testar se um parâmetro existe, retornando seu próprio valor caso positivo, e um valor alternativo caso contrário. No PHP 5.6, teríamos de testar a existência do parâmetro antes de retornar seu valor, caso contrário receberíamos um E_NOTICE. Agora é possível usar o operador ??, que testa a presença do parâmetro e não lança um aviso em caso de não estar definido:
$lista = ['chave' => 'valor'];
// PHP 5.6
$a = isset($lista['nao_tem']) ? $lista['nao_tem'] : 123; // válido
$a = $lista['nao_tem'] ?: 123; // E_NOTICE se a chave não existir
// PHP 7
$a = $lista['nao_tem'] ?? 123; // válido

Sintaxe Uniforme de Variáveis

Foi introduzida uma sintaxe de variáveis consistente, que permitirá realizar operações sobre expressões arbitrárias, aninhadas e/ou diferentes, de forma semelhante ao que já podemos fazer em JavaScript.
$empresa->getConsultores()[0]->marcarComoAtivo();
Classe::getClosure()();

Remoção de Tags Alternativas

As seguintes tags alternativas para abrir e fechar código PHP foram removidas: <%, <%=, %>, .

Agrupar classes inclusas com "use"

Quando utilizamos diversas classes de um mesmo namespace, agora será possível agrupá-las ao invés de repetir o namespace para cada classe:
// PHP 5.6
use yii\helpers\ArrayHelper;
use yii\helpers\Html;
use yii\helpers\Url;
// PHP 7
use yii\helpers\{ArrayHelper, Html, Url};

Operador de Divisão de Inteiros

Foi adicionado um novo operador (%%) e uma nova função (intdiv) que permitem a divisão de um inteiro por outro, retornando um inteiro ao invés de um float. Desta forma, 3 %%2 (ou intdiv(3, 2)) resultaria em 1 enquanto 3 / 2 resultaria em 1.5.

Classes Anónimas

Tais como funções anónimas (closures), classes anônimas são úteis quando apenas criadas e/ou utilizadas em tempo de execução.
var_dump((new class {
     public function execute() { return 12345; }
})->execute()); // 12345

Conclusão

O PHP 7 mal saiu do forno, mas já são discutidas as novidades para a geração 7.1. Para saber mais e acompanhar o desenvolvimento do PHP, acompanhe a página de Request for Comments no site.