Upload
weltling
View
1.022
Download
0
Embed Size (px)
Citation preview
Portable PHP“All for one, one for all.”
Alexandre Dumas
Anatol BelskiPHP SpecialistNovember 2015
Interoperable PHP
Anatol Belski
@weltling
#php.pecl@efnet
#winphp-dev@freenode
PHP 7.0 release manager
PHP core developer
OSS guy
Interoperable PHP
OSTC
• PHP
• Hyper-V
• Azure
• Samba
• Docker
Interoperable PHP
Interoperability
Hardware
Architecture
OS
Program
Interoperable PHP
A cross-platform program is …
- Hardware
- OS
- Architecture
- …
independent and can run under various constellations.
Interoperable PHP
Topics
• Filesystem
• Time API
• Performance
• 32- vs 64-bit
• Thread safety
• Beyond
Interoperable PHP
Brief UNIX/Windows diff
UNIX/Linux
• gcc
• many libs
• processes
• C99
• Ext*, reiserFS, HFS, etc.
• UNIX permissions
Windows
• vc++
• core API + OSS libs
• threads
• C99 starting with VC12
• NTFS, FAT
• ACLs
Filesystem
Interoperable PHP
File permissions
UNIX/Linux
• chmod +x file
• chmod -r file
• chmod ugo-r file
• chmod +r file
• no equivalent
• no equivalent
• chmod +t somedir
Windows
• no equivalent
• icacls file /deny nick:(R)
• no equivalent
• icacls file /grant nick:(R)
• icacls file /grant nick:(GR,GW)
• icacls file /inheritance:e
• no equivalent
Interoperable PHP
File/process permissions
• UNIX/Linux• chmod(), chown(), etc.
• process permissions are handled same way as file ones
• Windows• icacls
• impersonation
• Unmapped UNIX users built-in SID mapping
Interoperable PHP
Access time
• ext3, ext4 and others• noatime,nodiratime in /etc/fstab
• NTFS• fsutil behavior query DisableLastAccess
• fsutil behavior set DisebleLastAccess 0
Interoperable PHP
NTFS streams
C:\tmp> echo hello > foo.txt
C:\tmp>echo world > foo.txt:bar.txt
C:\tmp>dir /r foo.txt
Volume in drive C is SYSTEM
Volume Serial Number is AE0A-76BD
Directory of C:\tmp
08/31/2015 11:50 PM 8 foo.txt
8 foo.txt:bar.txt:$DATA
1 File(s) 8 bytes
0 Dir(s) 59,944,050,688 bytes free
Interoperable PHP
PHP FS snippet 1
<?php
var_dump(file_exists("/"));
// Windowsbool(true)
//Linuxbool(true)
Interoperable PHP
PHP FS snippet 2
<?php
var_dump(dirname('/windows/system', 2));
// Windowsstring(1) "\“
//Linuxstring(1) “/"
Interoperable PHP
PHP FS snippet 3
<?php
$f = fopen("file.txt", "w");
var_dump(unlink("file.txt"));
// Windows
Warning: unlink(file.txt): Permission denied in Command line code on line 1
bool(false)
//Linux
bool(true)
Interoperable PHP
PHP FS snippet 4
<?php
var_dump(fopen("some/directory", "r"));
// Windows
Warning: fopen(some/directory): failed to open stream: Permission denied in Command line code on line 1
bool(false)
//Linux
resource(5) of type (stream)
Interoperable PHP
Some PHP FS functions
• readdir()
• glob()
• symlink()
• relapath()
• temp dir
• PHP extension paths
Time APIs
Interoperable PHP
System time APIs
• TSC• RDTSC
• RDTSCP
• PM clock
• HPET timer
• POSIX clock
• WIN8+
Interoperable PHP
gettimeofday()
• UNIX/Linux• us resolution + dependency on userspace tools
• Windows• Win8+ with resolution <1us
Interoperable PHP
Time examples in PHP
• microtime() != microtime()
• uniqid() is based on usleep()
• usleep()
• timeout handling
Interoperable PHP
Timeout handling
<?php
set_time_limit(3);
/* do some work */
$until = microtime(true) + 2;
while($until > microtime(true));
sleep(1);
/* do some work */
$until = microtime(true) + 1;
while($until > microtime(true));
cho “reached here”;
PHP Performance
Interoperable PHP
PHP opcode caches
• Opcache
• WinCache
• APC
• APCu
Interoperable PHP
Performance PHP way
• QB extension
• Zephir
• Recki-ct
• Memcache, etc.
• Write good PHP
Interoperable PHP
Performance compiler way
• PGO (VC++)
• LTO/FDO (gcc)
• Assembler
• Compiler intrinsics
Interoperable PHP
PGO
Instrument
• Produce an instrumented build
Train
• Run training scenarios
Optimize
• Produce optimized build using the training data
Interoperable PHP
PGO commands
• configure –enable-pgi
• nmake
• x64\Release\php.exe run-training-script.php
• nmake clean
• configure –enable-pgo
• nmake
Interoperable PHP
FDO commands
• make clean
• make prof-gen
• sapi/cli/php run-training-script.php
• make prof-clean
• make prof-use
64-bit
Interoperable PHP
Do you think this works?
$x = str_repeat("x", PHP_INT_MAX);
Interoperable PHP
64- vs 32-bit in PHP
64-bit
• In general slower
• 9.22337204 × 109 GB RAM addressable
• 64-bit integers
• LFS
• 64-bit string length
32-bit
• In general faster
• Less than 2 GB RAM addressable
• 32-bit integers
• 32-bit file operations
• 32-bit string length
Interoperable PHP
Types in PHP7
• zend_long for integers
• zend_ulong for numeric hashes
• size_t for string length
• zend_off_t for file offsets
• zend_stat_t for file status information
• See UPGRADING for more info
Interoperable PHP
64-bit affecting some functions
• stat()
• lstat()
• filesize()
• substr()
• ftell()
• fseek()
Treads vs. Processes
Interoperable PHP
Process
Program code
OS
Processor core #n
Interoperable PHP
Threads
Thread #3
Thread #1
Thread #2
Interoperable PHP
Process/Thread
Process single threaded
stack
text
data
heap
Process multi threaded
stack
stack
text
data
heap
Thread 1
Thread 2
Interoperable PHP
Treads vs processes
• Thread locking
• Shared memory
• security
• performance
Thread 1
Thread 2
static __thread int i = 0; static int j = 0; void start_thread(void *dummy) { char hello[6]; char *world; memcpy(hello, "hello", 5); world = malloc(sizeof(char) * 5); memcpy(world, "world", 5); i++; } int main(int argc, char **argv) { pthread_t t0, t1; rc = pthread_create(&t0, NULL, start_thread, NULL); rc = pthread_create(&t1, NULL, start_thread, NULL); return 0; }
Interoperable PHP
PHP SAPIs
• Apache (worker, prefork, winnt)
• CGI/FastCGI/FPM (NGINX, IIS, Apache, etc.)
• Embed
• Many unsupported SAPIs removed in PHP7
Interoperable PHP
Apache mpm_prefork
Master
Child 1
Child 2
Child n
Interoperable PHP
Apache mpm_worker
Master
Child 1
Child 2
Child n
\\\\\\\\\\\v
Thread 1
Thread 2
Thread n
\\\\\\\\\\\v
\\\\\\\\\\\v
Thread 1
Thread 2
Thread n
\\\\\\\\\\\v
\\\\\\\\\\\v
\\\\\\\\\\\v
Thread 1
Thread 2
Thread n
\\\\\\\\\\\v
\\\\\\\\\\\v
\\\\\\\\\\\v
\\\\\\\\\\\v
Interoperable PHP
Apache mpm_winnt
\\\\\\\\\\\v
Master Child
Thread 1
Thread 2
Thread n
\\\\\\\\\\\v
\\\\\\\\\\\v\\\\\\\\\\\v
Interoperable PHP
void ***tsrm_ls in PHP 5
Interoperable PHP
TS layer in PHP 7
• Global thread specific pointer per binary unit
• Optional special setup to cache TS resource
• No additional tsrm_ls arguments in functions
Interoperable PHP
TLS
● __thread qualifier is not a standard
● __declspec(thread) is not a standard
● thread_local is C++11 standard (not in PHP)
● pthread_setspecific, TlsSetValue, etc.
Interoperable PHP
TLS types in PHP 7TSRM/TSRM.h
#ifdef TSRM_WIN32# define TSRM_TLS __declspec(thread)#else# define TSRM_TLS __thread#endif
Zend/zend_types.h
#ifdef ZTS#define ZEND_TLS static TSRM_TLS#define ZEND_EXT_TLS TSRM_TLS#else#define ZEND_TLS static#define ZEND_EXT_TLS#endif
Interoperable PHP
TS or NTS with PHP?
TS
• Less RAM consuming
• Faster startup
• Less library compatibility
• More complexity
• Slower processing
NTS
• More RAM consuming
• Slower startup
• More library compatibility
• Less complexity
• Faster processing
Interoperable PHP
Some PHP core functions
• mt_rand()
• fork()
• chroot()
• setlocale()/localeconv()
• symlink()/link()
• fputcsv()
• mail()
• getenv()/putenv()
Interoperable PHP
C APIs implementations in PHP
snprintf sprintf spprintf strlcat strlcpyglob sscanf strnatcmp strtodgettimeofday usleep nanosleepselect opendir readdir rewinddirflock socketpair syslog openlogcloselog ...
Questions?
Thanks for your attention!
Interoperable PHP
Links
• https://msdn.microsoft.com/en-us/library/e7k32f4k.aspx
• http://blogs.msdn.com/b/vcblog/archive/2013/05/06/speeding-up-php-performance-for-your-application-using-profile-guided-optimization-pgo.aspx
• https://msdn.microsoft.com/en-us/library/windows/desktop/aa364404%28v=vs.85%29.aspx
• https://wiki.php.net/rfc/removal_of_dead_sapis
• https://wiki.php.net/rfc/remove_deprecated_functionality_in_php7
• https://wiki.php.net/rfc/native-tls
• https://wiki.php.net/rfc/size_t_and_int64_next