The downloads on this page are not meant to be run in production. They are
for testing only.
If you find a problem when running your library or application with these
builds, please file a report on
GitHub Issues.
The QA API is based on the query string.
Pass in the format parameter, with serialize or
json as value to obtain all information:
To only try dev version numbers, add only=dev_versions:
';
site_header("Pre-Release Builds", [
'current' => 'downloads',
]);
?>
This page contains links to the Pre-release builds that the release
managers create before each actual release. These builds are meant for the
community to test whether no inadvertent changes have been made, and
whether no regressions have been introduced.
$file_info) : ?>
-
No checksum value available)
There are no QA releases available at the moment to test.
Windows Builds
= 2) {
$branchKey = $parts[0] . '.' . $parts[1];
$allowedBranches[$branchKey] = true;
}
}
}
$buildLabel = static function (string $key, array $entry): string {
$tool = 'VS';
if (strpos($key, 'vs17') !== false) {
$tool .= '17';
} elseif (strpos($key, 'vs16') !== false) {
$tool .= '16';
} elseif (strpos($key, 'vc15') !== false) {
$tool = 'VC15';
}
$arch = (strpos($key, 'x64') !== false) ? 'x64' : ((strpos($key, 'x86') !== false) ? 'x86' : '');
$ts = (strpos($key, 'nts') !== false) ? 'Non Thread Safe' : 'Thread Safe';
if (strncmp($key, 'nts-', 4) === 0) {
$ts = 'Non Thread Safe';
} elseif (strncmp($key, 'ts-', 3) === 0) {
$ts = 'Thread Safe';
}
return trim(($tool ? $tool . ' ' : '') . ($arch ? $arch . ' ' : '') . $ts);
};
$packageNames = [
'zip' => 'Zip',
'debug_pack' => 'Debug Pack',
'devel_pack' => 'Development package (SDK to develop PHP extensions)',
];
$makeListItem = static function (string $label, array $fileInfo, ?string $mtime, bool $includeSha) use ($winQaBase): ?string {
$path = $fileInfo['path'] ?? '';
if ($path === '') {
return null;
}
$href = $winQaBase . ltrim($path, '/');
$size = $fileInfo['size'] ?? '';
$sha = $fileInfo['sha256'] ?? '';
$hrefAttr = htmlspecialchars($href, ENT_QUOTES, 'UTF-8');
$labelText = htmlspecialchars($label, ENT_QUOTES, 'UTF-8');
$parts = ['
' . $labelText . ''];
if ($size !== '') {
$parts[] = '
' . htmlspecialchars($size, ENT_QUOTES, 'UTF-8') . '';
}
if ($mtime) {
$timestamp = strtotime($mtime);
if ($timestamp) {
$parts[] = '
' . gmdate('d M Y', $timestamp) . '';
}
}
if ($includeSha && $sha !== '') {
$parts[] = '
' . htmlspecialchars($sha, ENT_QUOTES, 'UTF-8') . '';
}
return '
' . implode(' ', $parts) . '';
};
foreach ($decoded as $branch => $info) {
if (!is_array($info) || empty($info['version'])) {
continue;
}
if ($branch === 'comment') {
continue;
}
if (!empty($allowedBranches) && empty($allowedBranches[$branch])) {
continue;
}
$topItems = [];
if (!empty($info['source']) && is_array($info['source'])) {
$item = $makeListItem('Download source code', $info['source'], $info['source']['mtime'] ?? null, false);
if ($item !== null) {
$topItems[] = $item;
}
}
if (!empty($info['test_pack']) && is_array($info['test_pack'])) {
$item = $makeListItem('Download tests package (phpt)', $info['test_pack'], $info['test_pack']['mtime'] ?? null, false);
if ($item !== null) {
$topItems[] = $item;
}
}
$builds = [];
foreach ($info as $buildKey => $entry) {
if (!is_array($entry) || in_array($buildKey, ['version', 'source', 'test_pack'], true)) {
continue;
}
$label = $buildLabel($buildKey, $entry);
if ($label === '') {
continue;
}
$packageItems = [];
foreach ($packageNames as $pkgKey => $pkgLabel) {
if (empty($entry[$pkgKey]) || !is_array($entry[$pkgKey])) {
continue;
}
$rendered = $makeListItem($pkgLabel, $entry[$pkgKey], $entry['mtime'] ?? null, true);
if ($rendered !== null) {
$packageItems[] = $rendered;
}
}
if (empty($packageItems)) {
continue;
}
$builds[] = [
'label' => $label,
'items' => $packageItems,
];
}
if (empty($topItems) && empty($builds)) {
continue;
}
$winQaReleases[] = [
'version_label' => $info['version'],
'top_items' => $topItems,
'builds' => $builds,
];
}
if (!empty($winQaReleases)) {
usort($winQaReleases, static function ($a, $b) {
return version_compare($b['version_label'], $a['version_label']);
});
}
} else {
$winQaMessage = 'Windows QA release index could not be parsed.';
}
} else {
$winQaMessage = 'Windows QA release index is unavailable.';
}
if ($winQaMessage !== '') {
echo '
', htmlspecialchars($winQaMessage), '
';
} elseif (empty($winQaReleases)) {
echo "
No Windows QA builds match the currently active QA releases.
";
} else {
foreach ($winQaReleases as $release) {
$versionLabel = $release['version_label'];
echo '
PHP ', htmlspecialchars($versionLabel), '
';
echo '
';
if (!empty($release['top_items'])) {
echo '
';
foreach ($release['top_items'] as $item) {
echo $item;
}
echo '
';
}
foreach ($release['builds'] as $build) {
echo '
' . $build['label'] . '
';
echo '
';
foreach ($build['items'] as $item) {
echo $item;
}
echo '
';
}
echo '
';
}
}
?>
$SIDEBAR_DATA]);