Interoperable PHP

Post on 15-Apr-2017

572 views 2 download

Transcript of Interoperable PHP

Interoperable PHP“We are only as strong as we are united, as weak as we are divided.”

Dambledore

Anatol BelskiPHP SpecialistSeptember 2015

Interoperable PHP

Anatol Belski

@weltlingab@php.net

#php.pecl on efnet#winphp-dev on freenode

PHP 7.0 release managerPHP core developer

OSS guy

Interoperable PHP

OSTC• PHP• Hyper-V• Azure• Samba• Docker

Interoperable PHP

InteroperabilityHardware

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 streamsC:\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 microtime()• usleep()• timeout handling

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

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 offsets

Treads vs. Processes

Interoperable PHP

Threads

Thread #3

Thread #1

Interoperable PHP

Process/ThreadProcess 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

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

TLS● __thread qualifier is not a standard● __declspec(thread) is not a standard● thread_local is C++11 standard

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

TLS in PHP7TSRM/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 strlcpy glob sscanf strnatcmp strtod gettimeofday usleep nanosleep select opendir readdir rewinddir flock socketpair syslog openlog closelog ...

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