<?php
 
/*************************************************************************************************************************
 
* Author: Riccardo Castagna MBA, PHP developer - Palermo (ITALY) https://api.whatsapp.com/send?phone=393315954155         *
 
* This php package solves the problem to charge an external font resource                                                 *
 
* with the "controlling font performance" using font-display options.                                                     *
 
* This option is useful, to fast load the external font and in general to have the control over browser behavioral        *
 
* and, in particular, over how the different browsers have to load the external font.                                     *
 
* This option is useful to make all text remains visible during web font loads,                                           *
 
* leveraging the font-display CSS feature to ensure text is user-visible while web fonts are loading.                     *
 
* At the moment is no possible to add at any external font resource the font-display options,                             *
 
* when you call the query, for example, through google font API:                                                          *
 
* "https://fonts.googleapis.com/css?family=Montserrat+Alternates%3A300%2C500"                                             *
 
* and you wish to add the descriptor param: "&font-display=fallback"                                                      *
 
* making something like this query:                                                                                       *
 
* "https://fonts.googleapis.com/css?family=Montserrat+Alternates%3A300%2C500&font-display=fallback".                      *
 
* Also with the alternative method using @import url(//fonts.googleapis.com/css?family=Open+Sans); inside css you are     *
 
* not able to set up the values for font-display. And not even, I think I'm not wrong (I gave only a quick                *
 
* look at this library), with the JavaScript library:                                                                     *
 
* Web Font Loader: https://developers.google.com/fonts/docs/webfont_loader                                                *
 
* At the moment the only way is the manual set up for each                                                                *
 
* css element: p {font-family: 'MyWebFont', fallback, sans-serif;}                                                        *
 
* As far as I know, google or someone else has not yet solved this issue and, to work,                                    *
 
* the "font-display" descriptor option must be inserted as value inside the css function @font-face{...}.                 *
 
*                                                                                                                         *
 
* A possible way is, to use the PHP to manipulate this external resourse and add                                          *
 
* the font-display option param inside the css function, moreover, in this way, the API keys, when these are necessary,   *
 
* will be hidden.                                                                                                         *                                                            
 
* With this php class there is also the possibility (VIEW:ADVANCED CLASS USAGE EXAMPLE N?2 FILE: INDEX_2.PHP)             *
 
* to load the external fonts all together simultaneously,  index_2.php.                                                   *
 
* To avoid changing this demo into a cyber attack to google servers, and if we want to prevent                            *
 
* google killing me and you; I joke, obviously, I joke ... ;), in the example N 2, I have entered  the possibility,       *
 
* for the external font files to be stored locally setting a param option: true for locally stored and false for not.     *
 
* Since, usually, we don't change fonts every day, why we have to connect each time to this external resources ?          *
 
* Is it necessary .... ? My thought is no, it is not necessary, instead, it need to set the .htaccess file with           *
 
* a long time cache for the font files.                                                                                   *
 
* In the EXAMPLE TWO I have loaded seven different font simultaneously from only one server,                              *
 
* seven are too much, but I did it only for testing to show                                                               *
 
* that also in this case, with seven different fonts, all text remains visible with                                       *
 
* the set up of the font-display during web fonts load.                                                                   *
 
* Simultaneously, when the param option is set to true,                                                                   *
 
* became only the check of the server to the external font resource, and the resources are downloaded only                *                                                                                                 
 
* if locally don't exists.                                                                                                *
 
* To avoid the critical request chain  https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains  *
 
* I have set up to defer (load asynchronously) the style with a small escamotage:                                         *
 
* <style media="none" onload="if(media!='all')media='all'" >                                                              *                                                                                       *
 
*                                                                                                                         *
 
* SIMPLE CLASS USAGE EXAMPLE N?1 FILE:INDEX.PHP (FONT-DISPLAY YES, NO SIMULTANEOUSLY CHECK,                               *
 
* NO FONT FILES ARE STORED LOCALLY, .HTACCESS CACHE YES);                                                                 *
 
* $ref= new Fontperformance;                                                                                              *
 
* $font_1 = $ref->fontdisplay("link_to_font_api","fallback");                                                             *
 
* $font_2 = $ref->fontdisplay("link_to_font_api","auto");                                                                 *
 
* Where param 1 is a string, is the link to external font resource, in this example through google font api.              *
 
* param 2 is a string, is the performance controlling option. Possible values are:                                        *
 
* auto | block | swap | fallback | optional                                                                               *
 
*                                                                                                                         *
 
* ADVANCED CLASS USAGE EXAMPLE N?2 FILE:INDEX_2.PHP (FONT-DISPLAY YES, SIMULTANEOUSLY CHECK YES,                          *
 
* ALL FONT FILES ARE STORED LOCALLY IF LOCALLY DO NOT EXIST, .HTACCESS CACHE YES);                                        *
 
* $ref= new Fontperformance;                                                                                              *
 
* $apilink = array("link_to_font_api_1","link_to_font_api_n", ....);                                                      *
 
* $ref->multi_simul_fontdisplay($apilink,"fallback", true );                                                              *
 
* where the params1 is an array with all links to the font api, it's good, also, for only one font,                       *
 
* and where the param 2 is a string, is the performance controlling option. Possible values are:                          *
 
* auto | block | swap | fallback | optional , this will return an array with all fonts,                                   * 
 
* param 3: true o false, true for storing locally the exernal fonts, false for not storing, (default value is false).     *
 
*                                                                                                                         *
 
* For a complete reference guide about font-display descriptor values please consult:                                     *
 
* https://developers.google.com/web/updates/2016/02/font-display                                                          *
 
* https://www.w3.org/TR/css-fonts-4/#font-display-font-feature-values                                                     *
 
**************************************************************************************************************************/
 
include_once("./lib/class.fontperformance.php"); 
 
$ref= new Fontperformance;
 
$font_display = $ref->fontdisplay("https://fonts.googleapis.com/css?family=Montserrat+Alternates","fallback");
 
$font_display_2 = $ref->fontdisplay("https://fonts.googleapis.com/css?family=Tangerine","fallback");
 
?>
 
<!DOCTYPE html>
 
<html lang='it'>
 
  <head>
 
    <title>Controlling Font Performance with font-display</title>
 
    <meta charset='utf-8'>
 
    <meta name='description' content='Controlling Font Performance with font-display'>
 
    <meta name='keywords' content='Font Performance font-display'>
 
    <meta name='author' content='Riccardo Castagna'>
 
    <meta name='robots' content='all'>
 
    <meta name="viewport" content="width=device-width, initial-scale=1">
 
    <!-- <meta http-equiv='X-UA-Compatible' content='IE=edge'> -->
 
    <link href='./php-icon.png' rel='shortcut icon' type='image/png'>
 
   
 
<style media="none" onload="if(media!='all')media='all'" >
 
<?php echo $font_display, $font_display_2;  ?>
 
body { 
 
margin: 0px;
 
padding: 0px;
 
}
 
h1,h2, .montserrat {font-family:"Montserrat Alternates";} 
 
.tangerine {font-family:"Tangerine";font-size: 40px;} 
 
h1{
 
font-size: 35px;
 
text-align: center;
 
}
 
h2 {font-size: 28px;text-align: center;}
 
p {
 
font-size: 16px;  
 
}
 
.title{
 
width:100%;
 
}
 
</style>
 
</head>
 
  <body>
 
   <div class="title">
 
     <h1 >Controlling Font Performance with font-display, example n°1</h1>
 
     <h2 >FONT-DISPLAY YES, NO SIMULTANEOUSLY CHECK,<br> NO FONT FILES ARE STORED LOCALLY</h2>
 
   </div>
 
    <p class="montserrat"> This php package solves the problem to charge an external font resource<br>                                                 
 
 with the <strong>"controlling font performance"</strong> using font-display options.<br><br>                                                     
 
 This option is useful, to fast load the external font and in general to have the control over browser behavioral<br>        
 
 and, in particular,<br> over how the different browsers have to load the external font.<br><br>                                     
 
 <strong>This option is useful to make all text remains visible during web font loads,<br>                                           
 
 leveraging the font-display CSS feature to ensure text is user-visible while web fonts are loading.</strong><br><br>                     
 
 At the moment is no possible to add at any external font resource the font-display options,<br>                             
 
 when you call the query, for example, through google font API:<br>                                                          
 
 "https://fonts.googleapis.com/css?family=Montserrat+Alternates%3A300%2C500"<br>                                             
 
 and you wish to add the descriptor param: "&font-display=fallback"<br>                                                      
 
 making something like this query:<br>                                                                                       
 
 "https://fonts.googleapis.com/css?family=Montserrat+Alternates%3A300%2C500&font-display=fallback".<br>                      
 
 Also with the alternative method using @import url(//fonts.googleapis.com/css?family=Open+Sans); inside css you are<br>     
 
 not able to set up the values for font-display.<br> And not even, I think I'm not wrong (I gave only a quick<br>                
 
 look at this library), with the JavaScript library:<br>                                                                     
 
 <a href="https://developers.google.com/fonts/docs/webfont_loader">Web Font Loader </a><br>                                                
 
 At the moment the only way is the manual set up for each<br>                                                                
 
 css element: p {font-family: 'MyWebFont', fallback, sans-serif;}<br><br>                                                        
 
 As far as I know, google or someone else has not yet solved this issue and, to work,<br>                                    
 
 the "font-display" descriptor option must be inserted as value inside the css function @font-face{...}.<br><br>
 
 In short,<a href="https://www.w3.org/TR/css-fonts-4/#font-display-font-feature-values">as reported by the W3C</a>, when a font is served by a third-party font foundry,<br> the developer does not control the @font-face rules[..],<br>
 
 the importance to set a default policy for an entire font-family<br> is also useful to avoid the ransom note effect (i.e. mismatched font faces).<br><br>
 
                  
 
 <strong> A possible way is, to use the PHP to manipulate this external resourse and add<br>                                          
 
 the font-display option param inside the css function, moreover, in this way, the API keys, when these are necessary,<br>   
 
 will be hidden.</strong><br><br>
 
                                                                                                                                                                     
 
 With this php class there is also the possibility (VIEW:ADVANCED CLASS USAGE EXAMPLE N°2 FILE: INDEX_2.PHP)<br>             
 
 to load the external fonts all together simultaneously,  index_2.php.<br>                                                   
 
 To avoid changing this demo into a cyber attack to google servers, and if we want to prevent<br>                          
 
 google killing me and you; I joke, obviously, I joke ... ;), in the example N°2, I have entered the possibility,<br>       
 
 for the external font files, to be stored locally setting a param option: true for locally stored and false for not.<br>     
 
 Since, usually, we don't change fonts every day, why we have to connect each time to this external resources ?<br>          
 
 Is it necessary .... ? My thought is no, it is not necessary, instead, it need to set the .htaccess file with<br>           
 
 a long time cache for the font files.<br>                                                                                    
 
 In the EXAMPLE TWO I have loaded seven different font simultaneously from only one server,<br>                              
 
 seven are too much, but I did it only for testing to show<br>                                                               
 
 that also in this case, with seven different fonts, all text remains visible with<br>                 
 
 the set up of the font-display during web fonts load.<br>                                                                   
 
 Simultaneously, when the param option is set to true,<br>                                                                   
 
 became only the check of the server to the external font resource, and the resources are downloaded only<br>                                                                                                                 
 
 if locally don't exists.<br><br>
 
                                                                    
 
 To avoid the <a href="https://developers.google.com/web/tools/lighthouse/audits/critical-request-chains">critical request chain</a><br>  
 
 I have set up to defer (load asynchronously) the style with a small escamotage:<br>                                         
 
 style media="none" onload="if(media!='all')media='all'"<br><br>                                                              
 
Here you can see the ligthhouse reports, about performances, of these three demos,<br>example N°1 with two fonts not loaded simultaneously,<br>
 
 example N°2 with seven different fonts loaded and stored locally and<br>example N°3 with seven different fonts loaded simultaneously but not stored locally.<br>
 
 These tests are only indicative and to make a correct comparison<br> the quantities should be homogeneous, ie load the same number of fonts.<br> 
 
 In any case, from the various others tests carried out, the fastest is, in any case, the example N°2.<br><br>  
 
 example N°1 Emulated Nexus 5X, Throttled Fast 3G network,<br> Network throttling: 562,5 ms HTTP RTT, 1.474,6 Kbps down, 675 Kbps up (DevTools)<br>
 
 CPU throttling: 4x slowdown (DevTools):<br> 
 
 <a href="https://googlechrome.github.io/lighthouse/viewer/?gist=b316fc892210f82dfcf56f5285c75ee6">lighthouse performance report N 1</a><br>
 
 example N°1 Emulated Nexus 5X, Throttled Fast 3G network,<br> Network throttling: 150 ms TCP RTT, 1.638,4 Kbps throughput (Simulated)<br>
 
 CPU throttling: 4x slowdown (Simulated):<br>
 
 <a href="https://googlechrome.github.io/lighthouse/viewer/?gist=e79ffd09199fecaa5ecd35f84f3d32e8">lighthouse performance report N 1</a><br><br>                                          
 
 example N°2 Emulated Nexus 5X, Throttled Fast 3G network,<br> Network throttling: 562,5 ms HTTP RTT, 1.474,6 Kbps down, 675 Kbps up (DevTools)<br>
 
 CPU throttling: 4x slowdown (DevTools):<br>
 
 <a href="https://googlechrome.github.io/lighthouse/viewer/?gist=23b8f92d04eb3f32f6cfd7e317535510">lighthouse performance report N 2</a><br>
 
 example N°2 Emulated Nexus 5X, Throttled Fast 3G network,<br> Network throttling: 150 ms TCP RTT, 1.638,4 Kbps throughput (Simulated)<br>
 
 CPU throttling: 4x slowdown (Simulated):<br>
 
 <a href="https://googlechrome.github.io/lighthouse/viewer/?gist=b01c2975e469b0a2d36ea2224a78a84f">lighthouse performance report N 2</a><br><br>
 
  example N°3 Emulated Nexus 5X, Throttled Fast 3G network,<br> Network throttling: 562,5 ms HTTP RTT, 1.474,6 Kbps down, 675 Kbps up (DevTools)<br>
 
 CPU throttling: 4x slowdown (DevTools):<br>
 
 <a href="https://googlechrome.github.io/lighthouse/viewer/?gist=44ee33c578e928a59d04f13a60f18675">lighthouse performance report N 3</a><br>
 
 example N°3 Emulated Nexus 5X, Throttled Fast 3G network,<br> Network throttling: 150 ms TCP RTT, 1.638,4 Kbps throughput (Simulated)<br>
 
 CPU throttling: 4x slowdown (Simulated):<br>
 
 <a href="https://googlechrome.github.io/lighthouse/viewer/?gist=7d88e7348587aa49bc582e0e78375520">lighthouse performance report N 3</a><br><br>                                                                                                                       
 
                                                                                                                         
 
<strong>SIMPLE CLASS USAGE EXAMPLE N°1 FILE:INDEX.PHP (FONT-DISPLAY YES, NO SIMULTANEOUSLY CHECK,<br>                               
 
 NO FONT FILES ARE STORED LOCALLY, .HTACCESS CACHE YES);</strong><br>                                                      
 
 $ref= new Fontperformance;<br>                                                                                              
 
 $font_1 = $ref->fontdisplay("link_to_font_api","fallback");<br>                                                             
 
 $font_2 = $ref->fontdisplay("link_to_font_api","auto");<br>               
 
 Where param 1 is a string, is the link to external font resource, in this example through google font api.<br>              
 
 param 2 is a string, is the performance controlling option. Possible values are:<br>                                        
 
 auto | block | swap | fallback | optional<br><br>                                                                               
 
                                                                                                                         
 
<strong>ADVANCED CLASS USAGE EXAMPLE N°2 FILE:INDEX_2.PHP (FONT-DISPLAY YES, SIMULTANEOUSLY CHECK YES,<br>                          
 
 ALL FONT FILES ARE STORED LOCALLY IF LOCALLY DO NOT EXIST, .HTACCESS CACHE YES);</strong><br>                                                     
 
 $ref= new Fontperformance;<br>                                                                                              
 
 $apilink = array("link_to_font_api_1","link_to_font_api_n", ....);<br>                                                      
 
 $ref->multi_simul_fontdisplay($apilink,"fallback",<strong>true</strong>);<br>                                                                    
 
 where the params1 is an array with all links to the font api,<br> it's good, also, for only one font,<br>                                                            
 
 and where the param 2 is a string, is the performance controlling option. Possible values are:<br>                                         
 
 auto | block | swap | fallback | optional <br>,
 
 param 3: true o false, true for storing locally the exernal fonts, false for not storing, (default value is false),                                                                               
 
<br> this will return an array with all fonts.<br>
 
<br> 
 
        For a complete reference guide about font-display descriptors please consult:<br> 
 
        <a href="https://developers.google.com/web/updates/2016/02/font-display">Controlling Font Performance with font-display
 
        </a><br>
 
        <a href="https://www.w3.org/TR/css-fonts-4/#font-display-font-feature-values">W3C font display</a><br><br>
 
        <a href="https://api.whatsapp.com/send?phone=393315954155">info & contacts</a>  
 
    </p>
 
    <p class="tangerine">Yours sincerely<br>Riccardo Castagna</p> 
 
  </body>
 
</html>
 
 |